Параметры GCC для строгого кода C90?
Я пытаюсь найти, какая комбинация gcc-флагов используется при тестировании строгого соответствия C90. Согласно предыдущему сообщению: Параметры GCC для строжайшего кода C?, мне нужен только -std = c90.
Однако вот что я пробовал:
$ cat t.c
#include <stdint.h> /* added in C99 */
int main()
{
uint64_t t;
return 0;
}
$ gcc -std=c90 -ansi -pedantic t.c
Вышеизложенное работает хорошо (никаких предупреждений/ошибок не получено).
Кто-нибудь знает о:
- gcc флаги имеют строгое соответствие ISO/IEC 9899: 1990
- Разный компилятор (tcc, clang...) с различным набором флагов?
EDIT:
Извините за мою формулировку, да, мне очень хотелось бы подражать строго соответствующему компилятору C90, иначе говоря, он должен потерпеть неудачу, если код попытается использовать какую-либо добавленную позже функцию (C99 приходит на ум). Поэтому pthread
include header должен выпустить предупреждение при компиляции в GNU/GCC вызывает режим C90 (так же, как заголовок stdint.h должен производить предупреждение без C99). -pedantic прекрасно предупреждает меня об использовании long long
, я не понимаю, почему он не должен предупреждать меня о uint64_t
.
Я использовал терминологию ИСО/МЭК 9899: 1990, как указано из:
В 1990 году стандарт ANSI C (с изменениями форматирования) был принят Международная организация по стандартизации (ИСО) в качестве ИСО/МЭК 9899: 1990, который иногда называют C90. Следовательно, термины "C89" и "C90" относятся к одному и тому же языку программирования.
EDIT2:
Документация GCC на самом деле понятна:
Некоторые функции, входящие в стандарт C99, принимаются как расширения в режиме C90 и некоторые функции, которые являются частью C11 стандарт принимаются как расширения в режимах C90 и C99.
Итак, мой вопрос перефразирован в:
- Есть ли заголовок компилятора + standard include в linux-системе, который строго соответствует C90?
Ответы
Ответ 1
Имейте в виду, что сам GCC - это соответствующая автономная реализация указанного стандарта C; такая реализация только поставляет небольшое подмножество стандартных файлов заголовков и практически ни одна из фактических функций стандартной библиотеки C, вместо этого полагаясь на другую сторону - glibc
на Linux-системы, например, - для поставки стандарта C библиотеки.
То, что вы ищете, не только предупреждает вас, когда вы используете функцию языка C99/C11/GNU, которая не находится на C90, но когда вы используете библиотечную функцию, которая не определена самим C90. К сожалению, только компилятор не может этого сделать по указанной выше причине - он отчужден от того, с какими libc
он используется. В системах glibc
стандартная библиотека C будет выбирать макросы, определенные -std=c90
или -ansi
:
Макрос __STRICT_ANSI__
предопределен, когда используется опция -ansi
. Некоторые файлы заголовков могут заметить этот макрос и воздерживаться от объявления определенных функций или определения определенных макросов, которые не требует стандарт ISO; это не мешать никаким программам, которые могли бы использовать эти имена для других вещей.
и вам поможет, отключив бесплатные расширения:
Если вы компилируете свои программы с помощью ‘gcc -ansi’
, вы получаете только функции библиотеки ISO C, если вы явно не запрашиваете дополнительные функции, определяя один или несколько макросов функций.
Однако это касается только расширений и функций POSIX-но-не-ISO C; он не спасет вас, если поведение функции задано по-разному в ISO C и POSIX.1!
Ответ 2
Соответствие C90 не означает, что компилятор не может предлагать другие заголовки, которые не упоминаются в стандарте C90. (sys/socket.h
, например.) Если вы хотите запретить их по какой-то странной причине, вы можете передать параметр -I
, чтобы добавить дополнительный путь include, и в этом пути поместить версии всех заголовков только C99, которые просто #error Don't include me
.