如何找到我当前的编译器标准,如果它是C90等

我正在研究Linux机器。 是否有任何系统命令可以找到我正在使用的C编译器后面的标准?

这是依赖于编译器的,我假设你正在使用GCC。 您可以使用以下命令检查编译器定义的宏:

gcc -dM -E - < /dev/null 

检查有关标志的手册 ,特别是:

__STDC_VERSION__

此宏扩展为C标准版本号,yyyymmLforms的长整型常量,其中yyyy和mm是标准版本的年份和月份。 这表示编译器符合哪个版本的C标准。 与STDC一样,除非GNU CPP与GCC一起使用,否则这对于整个实现来说不一定准确。

价值199409L表示1994年修订的1989 C标准,这是目前的默认标准; 值199901L表示1999年C标准的修订版。 对1999年修订的支持尚未完成。

如果使用-traditional-cpp选项,则未定义此宏,也不会在编译C ++或Objective-C时定义此宏。

在这个网站上,你可以找到很多关于此的信息。 请参阅此处的表格。

您也可以使用标准宏在代码中对此进行测试,例如(最初来自同名的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 

在编译时,检查预处理器宏:

  • __ANSI__
  • __STDC__
  • 对于c99, __STDC_VERSION__ > = 199901L

你可能有gcc,在这种情况下你可以在编译时指定标准,例如

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

要么:

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

类型:

 $ man gcc 

了解详情。

如果您的C编译器是gcc,则可以使用-std选项指定要遵循的C标准。 默认值为gnu89。 没有通用的系统命令来确定任何给定编译器的标准。 您需要查看文档。

除了以上答案。 如果您想检查您是否使用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。