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

Is the form for(int i = 0... a gnu extension?

我正在开发一个用 fortran 编写的计算软件,但我用 C 开发了一个小扩展。该软件必须具有高度可移植性,除其他限制外,它必须在 GCC 套件和英特尔编译器套件上编译。 我通常在 GCC 上进行测试,在我尝试使用英特尔套件进行编译之前,一切都很顺利。我在一个简单的 for 循环中遇到了 "expected an expression" 错误。 我创建了一个最小的测试用例,看起来 icc 拒绝编译 for 循环内的变量声明 header。

#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 从来没有问题。这是英特尔最近采用的 GNU 扩展吗?

这不是 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?