【问题标题】:How to compile a C project in C99 mode?如何在 C99 模式下编译 C 项目?
【发布时间】:2013-03-30 00:45:00
【问题描述】:

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

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

这是什么意思?

如何解决?

【问题讨论】:

  • 好吧,也许向您展示代码会是一个好的开始。
  • 将初始化拉出for循环。
  • 编译器在错误信息中说明了如何修复它。

标签: c c99


【解决方案1】:

你已经这样做了:

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 变量中。

【讨论】:

    【解决方案2】:

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

    你应该这样做:

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

    你可能在做什么

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

    【讨论】:

      【解决方案3】:

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

      gcc -std=c99 foo.c -o foo
      

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

      【讨论】:

        【解决方案4】:

        如果您想混合使用语句和变量声明,您仍然需要 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 模式可以获得很多 cool stuff,但它也会禁用 gcc 默认允许的其他一些很酷的东西,例如匿名结构以及结构和联合中的联合。

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

        【讨论】:

        • 在你的帖子中你提到了C90C89C90 有什么区别?例如; Introduction to GCC 书中的Section 3.3.3 给出了-std=c89-std=iso9899-std=c99。我没有看到“C90”。
        • ANSI 委员会在 1989 年采用了第一个 C 标准。ISO 委员会在 1990 年采用了相同的标准。这是同一件事。
        • 是的。最初的 ANSI 委员会非常努力地为国际社会制定标准。 ISO 委员会只做了一些更改,但随后 ANSI 委员会采纳了这些更改。所以它们完全一样。所以,是的,它们可以互换使用(但如果有人感到困惑,请准备好解释它们是相同的!:)。
        猜你喜欢
        • 1970-01-01
        • 2015-09-15
        • 2016-03-10
        • 1970-01-01
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        • 2021-11-24
        • 2016-05-04
        相关资源
        最近更新 更多