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

n9vozmp4  于 2023-03-01  发布在  其他
关注(0)|答案(7)|浏览(292)

我在一台Linux机器上工作。有没有系统命令可以找到我正在使用的C编译器所遵循的标准?

oknrviil

oknrviil1#

这是编译器相关的,我假设你使用的是GCC。你可以使用以下命令检查编译器定义的宏:

gcc -dM -E - < /dev/null

检查manual about the flags,特别是:

标准数据中心版本_###

这个宏扩展到C标准的版本号,一个长整型常量yyyymmL,其中yyyy和mm是标准版本的年份和月份。这表示编译器符合哪个版本的C标准。像__STDC__一样,这对整个实现来说不一定准确,除非GNU CPP与GCC一起使用。
值199409 L表示1994年修订的1989 C标准,这是当前默认值;值199901 L表示C标准的1999修订版。2对1999修订版的支持尚未完成。
如果使用-traditional-cpp选项,则不会定义此宏,编译C++或Objective-C时也是如此。
this site中你可以找到很多关于这个的信息。请看here的表格。

mbyulnm0

mbyulnm02#

你也可以在你的代码中使用标准宏来测试这一点,例如(最初来自同名的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
uttx8gqw

uttx8gqw3#

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

  • __ANSI__
  • __STDC__
  • 对于c99,__STDC_VERSION__〉= 199901升
kb5ga3dv

kb5ga3dv4#

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

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

或:

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

类型:

$ man gcc

了解全部详情。

gk7wooem

gk7wooem5#

要从命令行确定编译器支持的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
c0vxltue

c0vxltue6#

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

tvokkenx

tvokkenx7#

我相信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

会更合适吗

相关问题