Как найти стандарт моего текущего компилятора, например C90 и т. Д. - PullRequest
24 голосов
/ 14 февраля 2011

Я работаю на машине с Linux. Есть ли какая-нибудь системная команда, чтобы найти стандарт, за которым следует компилятор C, который я использую?

Ответы [ 6 ]

22 голосов
/ 14 февраля 2011

Это зависит от компилятора, я полагаю, вы используете GCC. Вы можете проверить макросы, определенные компилятором, используя:

gcc -dM -E - < /dev/null

Проверьте руководство о флагах , особенно:

__ STDC_VERSION __

Этот макрос распространяется на стандарт C номер версии, длинное целое константа вида ггггммм где гггг и мм год и месяц Стандартная версия. Это означает какая версия стандарта С компилятор соответствует. Как STDC , это не обязательно точно для вся реализация, если только GNU CPP используется с GCC.

Значение 199409L означает 1989 C стандарт с поправками 1994 года, который текущее значение по умолчанию; значение 199901L означает пересмотр C 1999 года стандарт. Поддержка 1999 года редакция еще не завершена.

Этот макрос не определен, если Опция -traditional-cpp не используется ни при компиляции C ++, ни в Objective-C.

На этом сайте вы можете найти много информации об этом. См. Таблицу здесь .

11 голосов
/ 14 февраля 2011

Вы также можете проверить это в своем коде, используя стандартные макросы, например (первоначально из одноименного проекта sourceforge):

#if defined(__STDC__)
# define PREDEF_STANDARD_C_1989
# if defined(__STDC_VERSION__)
#  define PREDEF_STANDARD_C_1990
#  if (__STDC_VERSION__ >= 199409L)
#   define PREDEF_STANDARD_C_1994
#  endif
#  if (__STDC_VERSION__ >= 199901L)
#   define PREDEF_STANDARD_C_1999
#  endif
#  if (__STDC_VERSION__ >= 201710L)
#   define PREDEF_STANDARD_C_2018
#  endif
# endif
#endif

Если вы хотите проверить это из командной строки, вы можете выбрать один (например, c89) и проверить возвращаемое значение из минимальной программы:

echo -e "#ifdef __STDC__\n#error\n#endif"|gcc -xc -c - > /dev/null 2>&1; test $? -eq 0  || echo "c89
6 голосов
/ 14 февраля 2011

Во время компиляции сверяйтесь с макросом препроцессора:

  • __ANSI__
  • __STDC__
  • __STDC_VERSION__> = 199901L для c99
4 голосов
/ 14 февраля 2011

Возможно, у вас есть gcc, и в этом случае вы можете указать стандарт во время компиляции, например,

$ gcc -Wall -std=c89 foo.c -o foo

или

$ gcc -Wall -std=c99 foo.c -o foo

Тип:

$ man gcc

для получения полной информации.

0 голосов
/ 14 августа 2017

В дополнение к ответам выше.Если вы хотите проверить, есть ли у вас C99.Просто определите структуру и инициализируйте ее как:

struct Tree{
    struct Node *root;
    struct Node NIL_t;
    struct Node * const NIL;    
}

struct Tree t = { .root = NULL, .NIL = &t.NIL_t }; //init.

Это работает только на C99.Если это не так, то вы не используете C99.

0 голосов
/ 14 февраля 2011

Если ваш компилятор C - gcc, вы можете использовать опцию -std, чтобы указать , какой стандарт C следует соблюдать.По умолчанию используется gnu89.Там нет общей системной команды для определения стандарта для любого данного компилятора.Вам нужно будет проверить документацию.

...