如何在C99模式下编译C项目?

mpl*_*use 22 c c99

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

error: 'for' loop initial declarations are only allowed in C99 mode
note: use option -std=c99 or -std=gnu99 to compile your code
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

怎么解决?

Blo*_*ard 33

你做到了这个:

for (int i=0;i<10;i++) {
Run Code Online (Sandbox Code Playgroud)

你需要改变它:

int i;
for (i=0;i<10;i++) {
Run Code Online (Sandbox Code Playgroud)

或者,正如错误所说,

使用选项-std = c99或-std = gnu99来编译代码.

从Ryan Fox的答案复制的更新:

gcc -std=c99 foo.c -o foo
Run Code Online (Sandbox Code Playgroud)

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


lus*_*oog 6

如果要混合语句和变量声明,您仍然需要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" */
}
Run Code Online (Sandbox Code Playgroud)

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

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

  1. -std=gnu99可能会启用"所有好东西",但我提醒你要避免这样做.如果您(或其他人)希望移植代码,将会带来不必要的困难.我可能有一个我的宠物项目的Windows版本,由某人免费移植,如果我没有这样做的话.它与你联系gcc.你不想被束缚.这是标准的全部血腥点.


Rya*_*Fox 5

其他答案使您可以解决GCC的默认模式。如果要使用C99(我通常建议这样做),则必须添加该编译器标志:

gcc -std=c99 foo.c -o foo
Run Code Online (Sandbox Code Playgroud)

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