22

编译 C 代码时收到以下错误消息:

error: 'for' loop initial declarations are only allowed in C99 mode
note: use option -std=c99 or -std=gnu99 to compile your code

这是什么意思?

如何解决?

4

4 回答 4

34

你已经这样做了:

for (int i=0;i<10;i++) {

您需要将其更改为:

int i;
for (i=0;i<10;i++) {

或者,正如错误所说,

使用选项 -std=c99 或 -std=gnu99 编译您的代码。

从 Ryan Fox 的回答中复制的更新

gcc -std=c99 foo.c -o foo

或者,如果您使用的是标准 makefile,请将其添加到 CFLAGS 变量中。

于 2013-04-08T02:58:06.960 回答
7

如果你想混合使用语句和变量声明,你仍然需要 C99。正如其他答案和错误消息本身所说,-std=c99在编译时添加到命令行以启用 C99 功能 [1]。

但是你总是被允许写一个复合语句(一个“块”,IOW,但标准从不使用这个词!)代替单个语句。

#include<stdio.h>
int main() {
    int i = 5;

    {   /* new block, new declarations. */
        int i;
        for (i=0;i<10;i++){
        }
    }
    printf("%d\n", i);  /* prints "5\n" */
}

这在 K&R、C90(又名 C89,它是同一件事)C99 中是合法的。

启用 C99 模式可以获得很多很酷的东西,但它也会禁用 gcc 默认允许的其他一些很酷的东西,例如结构和联合中的匿名结构和联合。

  1. -std=gnu99可能会启用“所有好东西”,但我提醒您避免这样做。如果您(或其他人)希望移植代码,这将造成不必要的困难。如果我没有做这件事,我可能会有我的宠物项目的 Windows 版本,由某人免费移植。它与您联系 gcc。你不想被束缚。这就是标准的全部血腥点。
于 2013-04-08T04:37:18.440 回答
6

其他答案为您提供了处理 GCC 的默认模式的方法。如果您想使用 C99(我通常推荐),那么您必须添加该编译器标志:

gcc -std=c99 foo.c -o foo

或者,如果您使用的是标准 makefile,请将其添加到 CFLAGS 变量中。

于 2013-04-08T03:37:28.273 回答
2

这意味着您不能在语句中声明变量for

你应该做:

int i ;
for( i = 0 ; i < len ; i++ )

你可能在做什么

for( int i = 0 ; i < len ; i++ )
于 2013-04-08T02:58:28.913 回答