Подтвердить что ты не робот

Параметры 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?
4b9b3361

Ответ 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.