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

WIP*_*WIP 0 c gcc icc

我正在研究用fortran编写的计算软件,但我在C中开发了一个小扩展.软件必须具有高可移植性,除了其他限制之外,还必须在GCC套件和英特尔编译器套件上进行编译.我通常在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;
}
Run Code Online (Sandbox Code Playgroud)

这给了我关于英特尔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)
Run Code Online (Sandbox Code Playgroud)

我不是C专家,但我看过这种形式已有数千次,GCC从未出现问题.这是英特尔最近采用的GNU扩展吗?

Lun*_*din 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
Run Code Online (Sandbox Code Playgroud)

对于上述编译器的旧版本,将c11换成c99.对于非常新的版本,您可以使用c17,但它似乎不支持icc.

有关更多信息,请参阅C,C99,ANSI C和GNU C之间的区别?