我在 Linux 机器上工作。是否有任何系统命令可以找到我正在使用的 C 编译器所遵循的标准?
这取决于编译器,我假设您使用的是 GCC。 您可以使用以下方法检查编译器定义的宏:
gcc -dM -E - < /dev/null
查看关于标志的手册,特别是:
###__STDC_VERSION__###
这个宏扩展到 C 标准的 版本号,长整型 yyyymmL 形式的常量,其中 yyyy 和 mm 是年和月 标准版。这意味着 哪个版本的C标准 编译器符合。像 __STDC__ 一样, 这不一定准确 整个实现,除非 GNU CPP 正在与 GCC 一起使用。
数值199409L表示1989 C 1994 年修订的标准,即 当前默认值;值 199901L 表示 C 的 1999 年修订版 标准。支持 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__
__STDC_VERSION__
>= 199901L 对于 c99你可能有 gcc,在这种情况下你可以在编译时指定标准,例如
$ gcc -Wall -std=c89 foo.c -o foo
或:
$ gcc -Wall -std=c99 foo.c -o foo
类型:
$ man gcc
了解详情。
为了从命令行确定您的编译器支持的 C 版本,只需键入:
gcc -dM -E - < /dev/null | grep "__STDC_"
将 gcc 替换为您要检查的编译器。
如果编译器支持C89(也叫ANSI C)或者ISO C90,你会看到
__STDC__
按照标准定义为1。 (但有时__STDC__
被设置为其他一些非零值)。
C89 与 C90 相同。 C89 被 ANSI 批准。一年后,ISO 批准了 ANSI 标准。 ISO 标准称为 C90。
ISO C90 标准被修改,非正式地称为 C95。 (有时,它也被称为 C94。但 C95 更常用)。 ISO 还批准了 C99、C11(2011 年)和 C17(2017 年)。
如果编译器支持C95或更高版本,你会看到
__STDC_VERSION__
定义。该值将因版本而异。 (例如,C99 将 __STDC_VERSION__
定义为 199901L 的值)。见https://sourceforge.net/p/predef/wiki/Standards/
如果你想在你的 C 程序中检查版本,试试这个代码:
#include <stdio.h>
#include <math.h> // Needed for INFINITY, HUGE_VAL, HUGE_VALF & HUGE_VALL
// constants (or macros)
#if !defined(__STDC__)
# define __STDC__ 0
#endif
#if !defined(__STDC_VERSION__)
# define __STDC_VERSION__ 0
#endif
int main()
{
if (!__STDC__ && !__STDC_VERSION__) printf("The C compiler does not comply with the C89 or later standard!\nIt likely complies with the 1978 K&R C standard (informally known as C78).\n");
else if (__STDC_VERSION__ >= 201710L) printf("The C compiler complies with the C17 standard.\n");
else if (__STDC_VERSION__ >= 201112L) printf("The C compiler complies with the C11 standard.\n");
else if (__STDC_VERSION__ >= 199901L) printf("The C compiler complies with the C99 standard.\n");
else if (__STDC_VERSION__ >= 199409L) printf("The C compiler complies with the amended C90 standard (also known as C95).\n");
else if (__STDC__) printf("The C compiler complies with the ANSI C89 / ISO C90 standard.\n");
puts("");
if (__STDC__) printf("\"__STDC__\": %ld\n", __STDC_VERSION__);
if (__STDC_VERSION__) printf("\"__STDC_VERSION__\": %ld\n\n", __STDC_VERSION__);
puts("");
if (__STDC_VERSION__ >= 199901L) printf(" INFINITY (added in C99): %f\n", INFINITY ); // Also works with %lf and %Lf
if (__STDC_VERSION__ >= 199901L) printf("-INFINITY (added in C99): %f\n", -INFINITY ); // Also works with %lf and %Lf
puts("");
if (__STDC_VERSION__ >= 199901L) printf(" HUGE_VALF (added in C99): %f\n", HUGE_VALF );
if (__STDC_VERSION__ >= 199901L) printf("-HUGE_VALF (added in C99): %f\n", -HUGE_VALF );
puts("");
if (__STDC__) printf(" HUGE_VAL (added in C89 (ANSI) which is the same as C90 (ISO)): %lf\n", HUGE_VAL );
if (__STDC__) printf("-HUGE_VAL (added in C89 (ANSI) which is the same as C90 (ISO)): %lf\n", -HUGE_VAL );
puts("");
if (__STDC_VERSION__ >= 199901L) printf(" HUGE_VALL (added in C99): %Lf\n", HUGE_VALL );
if (__STDC_VERSION__ >= 199901L) printf("-HUGE_VALL (added in C99): %Lf\n", -HUGE_VALL );
return 0;
}
以下是该程序使用来自 www.onlinegdb.com 的 C 编译器的输出:
The C compiler complies with the C99 standard.
"__STDC__": 199901
"__STDC_VERSION__": 199901
INFINITY (added in C99): inf
-INFINITY (added in C99): -inf
HUGE_VALF (added in C99): inf
-HUGE_VALF (added in C99): -inf
HUGE_VAL (added in C89 (ANSI) which is the same as C90 (ISO)): inf
-HUGE_VAL (added in C89 (ANSI) which is the same as C90 (ISO)): -inf
HUGE_VALL (added in C99): inf
-HUGE_VALL (added in C99): -inf
如果您的 C 编译器是 gcc,您可以使用
-std
选项来 指定 遵循哪个 C 标准。默认是 gnu89。没有通用的系统命令来确定任何给定编译器的标准。您需要查看文档。
我相信 Tarantula 的回答并不完全正确——因为 c89 和 c90 是相同的标准(并且至少被 clang 和 gcc 以这种方式对待),并且没有定义
__STDC_VERSION__
。
所以也许是这样的:
#if defined(__STDC__)
# if defined(__STDC_VERSION__)
# if (__STDC_VERSION__ >= 201710L)
# define C_LANGUAGE_STANDARD 2018
# elif (__STDC_VERSION__ >= 201112L)
# define C_LANGUAGE_STANDARD 2011
# elif (__STDC_VERSION__ >= 199901L)
# define C_LANGUAGE_STANDARD 1999
# elif (__STDC_VERSION__ >= 199409L)
# define C_LANGUAGE_STANDARD 1995
# endif
# else
# define C_LANGUAGE_STANDARD 1990
# endif
#else
# define C_LANGUAGE_STANDARD 1972
#endif
会更合适吗?