是(int i = 0 ... gnu扩展名的形式吗?

时间:2019-02-11 09:08:34

标签: c gcc icc

我正在使用用fortran编写的计算软件,但我在C语言中进行了一些扩展。该软件必须具有高度的可移植性,并且除其他限制外,还必须同时在GCC套件和Intel编译器套件上进行编译。 我通常在GCC上进行测试,直到尝试使用intel套件进行编译为止,一切都进行得很好。我在简单的for循环上收到“期望的表达式”错误。 我创建了一个最小的测试用例,看来icc拒绝在for循环头中编译变量的声明。

#include <stdio.h>

int main(int argc, char** argv){
    for(int i = 0; i < 5; i++){
        printf("%d\n", i);
    }
    return 0;
}

这给我以下有关英特尔13、15、16、17和18(而不是19)的信息

$ icc test.c -o ./test
test.c(4): error: expected an expression
    for(int i; i < 5; i++){
        ^

test.c(4): error: identifier "i" is undefined
    for(int i; i < 5; i++){
               ^

compilation aborted for test.c (code 2)

我不是C专家,但我看过这种形式的数千次了,GCC从来没有问题。这是Intel最近采用的GNU扩展吗?

1 个答案:

答案 0 :(得分:5)

这不是GCC扩展,您仅使用的是旧版本的ICC编译器。

for循环内的

循环迭代器声明在1999年(C99)被添加到标准中。一些较旧的编译器可能仍默认使用最旧的C标准C90,因此他们没有此功能。例如,早于5.0.0的gcc默认为“ gnu90”,即C90 +扩展名。较新的版本默认为“ gnu11”,即C11 +扩展名。

在icc,gcc和clang上,可以始终通过编译特定的C标准来解决此问题:

icc -std=c11 -pedantic-errors

对于提到的编译器的较旧版本,将c11替换为c99。对于非常新的版本,您可以使用c17,但icc似乎还不支持它。

有关更多信息,请参见What is the difference between C, C99, ANSI C and GNU C?