【问题标题】:How do I fix "for loop initial declaration used outside C99 mode" GCC error?如何修复“在 C99 模式外使用的 for 循环初始声明”GCC 错误?
【发布时间】:2010-09-06 16:41:41
【问题描述】:

我正在尝试解决the 3n+1 problem 并且我有一个看起来像这样的for 循环:

for(int i = low; i <= high; ++i)
        {
                res = runalg(i);
                if (res > highestres)
                {
                        highestres = res;
                }

        }

不幸的是,当我尝试使用 GCC 进行编译时出现此错误:

3np1.c:15:错误:“for”循环初始 在 C99 模式外使用的声明

我不知道C99模式是什么。有什么想法吗?

【问题讨论】:

    标签: c gcc for-loop


    【解决方案1】:

    我会尝试在循环之外声明i

    祝你好运解决 3n+1 :-)

    这是一个例子:

    #include <stdio.h>
    
    int main() {
    
       int i;
    
       /* for loop execution */
       for (i = 10; i < 20; i++) {
           printf("i: %d\n", i);
       }   
    
       return 0;
    }
    

    详细了解 C 中的 for 循环 here

    【讨论】:

    • 那你为什么不使用while循环呢?
    • @ErikW 你的问题很糟糕
    【解决方案2】:

    有一个编译器开关可以启用C99 mode,它允许在for循环中声明一个变量。要打开它,请使用编译器开关-std=c99

    或者正如@OysterD 所说,在循环外声明变量。

    【讨论】:

    • 实际上 -std=gnu99 可能更可取,因为这样您仍然可以获得 gcc 扩展(gcc 默认为 -std=gnu89,但是在接下来的几个版本中,这将更改为 gnu99)
    • @Spudd86:您是否想要启用 gcc 扩展取决于您在做什么。如果您的目标是编写可移植到 gcc 以外的编译器的代码,禁用它们会很有帮助。
    【解决方案3】:

    要在 CodeBlocks 中切换到 C99 模式,请按照以下步骤操作:

    点击Project/Build options,然后在标签Compiler Settings中选择子标签Other options,并在文本区域放置-std=c99,并点击确定

    这将为您的编译器打开 C99 模式。

    我希望这会对某人有所帮助!

    【讨论】:

    • 这有助于 Other Compiler options 下的代码块 16.1!虽然我使用了-std=gnu99,如上面的一些答案所示!
    • 但这暂时有帮助!我每次编译代码时都必须这样做!...:(
    • 不,你没有!每个新项目只能这样做一次。
    【解决方案4】:

    我也遇到了这个错误。

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

    在 C89/C90 标准中无效。正如 OysterD 所说,您需要这样做:

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

    C99 及更高版本的 C 语言标准允许您的原始代码。

    【讨论】:

    • 对于 gcc,给它一个“-std=c99”。有关其他功能,请参阅 Imran 的回答。
    • 是的,它是有效的 C;它只是无效的 C89/C90。
    • @KeithThompson:澄清。
    • 你仍然说它不是有效的 C,只有一个限定。它是完全有效的C; 1999 年标准取代并取代了 1990 年标准,而 2011 年标准取代并取代了 1999 年标准(尽管在您最初发布此答案时后者并不存在)。
    • @KeithThompson 好吧,我以为我不是这么说的。您认为“在 C89/C90 标准中无效”正确吗?
    【解决方案5】:

    @Blorgbeard:

    C99 中的新功能

    • 内联函数
    • 变量声明不再局限于文件范围或复合语句的开头
    • 几种新的数据类型,包括 long long int、可选的扩展整数类型、显式布尔数据类型和表示复数的复杂类型
    • 可变长度数组
    • 支持以 // 开头的单行 cmets,如在 BCPL 或 C++ 中
    • 新的库函数,例如 snprintf
    • 新的头文件,例如 stdbool.h 和 inttypes.h
    • 类型通用数学函数 (tgmath.h)
    • 改进了对 IEEE 浮点的支持
    • 指定的初始化器
    • 复合字面量
    • 支持可变参数宏(可变参数的宏)
    • 限制限定以允许更积极的代码优化

    http://en.wikipedia.org/wiki/C99

    A Tour of C99

    【讨论】:

      【解决方案6】:

      如果你用 C 语言编译

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

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

      您还可以使用 C99 开关集进行编译。将 -std=c99 放入编译行:

      gcc -std=c99 foo.c -o foo
      

      REF:http://cplusplus.syntaxerrors.info/index.php?title='for'_loop_initial_declaration_used_outside_C99_mode

      【讨论】:

        【解决方案7】:

        对于任何尝试从使用自动构建实用程序(如 Make)的外部源编译代码的人,为了避免跟踪显式 gcc 编译调用,您可以设置一个环境变量。在命令提示符下输入或输入 .bashrc(或 Mac 上的 .bash_profile):

        export CFLAGS="-std=c99"
        

        请注意,如果您遇到需要 C++ 11 的 C++ 编译的类似场景,则可以使用类似的解决方案:

        export CXXFLAGS="-std=c++11"
        

        【讨论】:

          【解决方案8】:

          Jihene Stambouli 最直接地回答了 OP 问题... 问题是; 为什么

          for(int i = low; i <= high; ++i)
          {
              res = runalg(i);
              if (res > highestres)
              {
                  highestres = res;
              }
          }
          

          产生错误;

          3np1.c:15: error: 'for' loop initial declaration used outside C99 mode
          

          答案是

          for(int i = low...
          

          应该是

          int i;
          for (i=low...
          

          【讨论】:

            【解决方案9】:

            在 Code::Blocks 16.01 中启用 C99 模式

            • 转到设置-> 编译器...
            • Compiler settings 选项卡的 Compiler Flags 部分中,选中复选框 'Have gcc 遵循 1999 ISO C 语言标准 [-std=c99]'

            【讨论】:

              【解决方案10】:

              我遇到了同样的问题,你只需要在循环之外声明i

              int i;
              
              for(i = low; i <= high; ++i)
              
              {
                      res = runalg(i);
                      if (res > highestres)
                      {
                              highestres = res;
                      }
              
              }
              

              【讨论】:

                【解决方案11】:

                对于 Qt-creator:只需在 *.pro 文件中添加下一行...

                QMAKE_CFLAGS_DEBUG = \
                    -std=gnu99
                
                QMAKE_CFLAGS_RELEASE = \
                    -std=gnu99
                

                【讨论】:

                  猜你喜欢
                  • 2013-01-19
                  • 2015-07-21
                  • 2011-08-18
                  • 2017-10-28
                  • 2015-06-02
                  • 2013-10-28
                  • 2014-09-10
                  相关资源
                  最近更新 更多