我正在使用用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扩展吗?
答案 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?