LINUX.ORG.RU

ANSI & POSIX


0

0

Подскажите, а если программа соответствует POSIX стандарту, она
соотв. ANSI и чем отличается функция если соответствует этим
двум стандартам?
Спасибо.

anonymous

Ты имеешь ввиду ANSI C?

Тогда так. Целью ANSI C есть стандартизация конструкций и библиотек языка С.

Например, отличия ANSI C от K&R C:
1. наличие прототипов функций.
2. поддержка const и volatile
3. локализация
4. возможность использования указателей на функции без их разименования

Ну и потом ANSI C описывает такие вещи как:
1. int printf(const char *, ...); то есть три точки в функциях, получающих переменное число аргументов.
2. Некоторый набор макросов, как то: _STDC_, _LINE_ и др.

Таким образом если функция удовлетворяет обоим стандартам, эта функция удовлетворяет ANSI C и не использует для своей работы никаких не POSIX вызовов или макросов.
Чтобы проверить это одним махом, используют след. прием:

#define _POSIX_SOURCE
/ *Это значит, что твои исходники соответсвуют ANSI C и POSIX.1 */

тогда по идее компилятор должен материть всюду, где он найдет не соответствие. Вернее препроцессор отфильтрует все не POSIX хедеры, а потом будут уже и матюки :))

В общем POSIX.1 включает в себя ANSI C на сколько я понимаю.

Несколько тумано наверное получилось, :)) прошу прощения

Banshee
()
Ответ на: комментарий от Banshee

2Banshee: Спасибо за разъяснение. Я вот читал доки по glibc,
cpp (препроцессор сишный), Системное программирование на C++ для
UNIX (Теренс Чан), Системное программирование в UNIX (три автора)
и много еще чего. Я вот что не понял:
-Если она соответствует и ANSI C и POSIX.1 она чистая ANSI прога
или ANSI + посих расширения(дополнительные функции и макросы),
которых нету в ANSI;?
-Насколько я правильно понимаю gcc расширения при определении
#define _POSIX_SOURCE или #define _POSIX_C_SOURCE недоступны,
пока не включить _GNU_SOURCE (ну это уже не по сабжу). А с этим
вообще замуты, т.к. определяется все (ANSI, POSIX.X, BSD, SVID и gnu
расширения).

anonymous
()

Нужно помнить, что ANSI С затрагивает также и вопросы семантики языка С. А POSIX описывает API, которому должны следовать совместимые продукты.

Строго говоря есть некоторые противоречия :)).
Например эти стандарты поразному трактуют такой кусок:

#include <stdio.h>

Типа в ANSI С инклудиться могут только файлы, а в POSIX не только файлы. Что я и сам незнаю :))

Для себя я решил, что POSIX.1 это вторая версия ANSI С, дополняющая его макросами, хедерами и т.д.

Две другие части POSIX - POSIX.1b и POSIX.1с занимаются вопросами API, а именно очереди сообщений, мьютексы, нити пайпы и др.

Banshee
()

2Banshee: Наверное мы думаем об одном: Что POSIX.1- это просто
надмножество над ANSI C, а нормальным языком- включает стандарт
ANSI C + дополнительные фичи, т.е. прога удовлетворяющая ANSI C
удовлетворяет POSIX 1, но не наоборот.
А вот про хедеры я не слышал. А есть урл где прочесть про это
можно? По стандартам неплохой урл есть:
http://www.opennet.ru/standard.shtml

anonymous
()

Фиг его знает где об этом можно прочесть в инете. Я в какой то книжке когда-то прочитал :))

Banshee
()

IEEE POSIX - Portable Operating System Interface, стандарт, описывающий, как вызывать службы ОС из программ. Есть не только для C, но и, например, для Ады. Насколько я понимаю, на язык и его компиляторы он никакого влияния не имеет. Если будете писать свою ОС совместимую с UNIX'ами, то смотрите сюда.

ANSI C - Стандарт языка C. Кроме семантики самого языка (т.е. что такое while, for, и т.п.), также содержит описание стандартных библиотек. Вероятно, в чём-то пересекается с POSIX'ом (я ни один из этих двух стандартов не читал), но, с другой стороны, не имеет отношения к операционным системам, то есть может существовать компилятор ANSI C для не-POSIX операционных систем. Этот стандарт для тех, кто пишет компиляторы C.

justme
()

Всем спасибо, вчера перечитал все свои доки по сабжу и
доперло. ;-) Непонятно, почему сразу не дошло.

З.Ы. ....истина где-то рядом ((с)Ха-филес) ;-)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.