如何修复“在 C99 模式外使用的 for 循环初始声明”GCC 错误?

Posted

技术标签:

【中文标题】如何修复“在 C99 模式外使用的 for 循环初始声明”GCC 错误?【英文标题】:How do I fix "for loop initial declaration used outside C99 mode" GCC error? 【发布时间】: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模式是什么。有什么想法吗?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何修复“在 C99 模式外使用的 for 循环初始声明”GCC 错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)

如何修复AppScan漏洞

如何在DOS环境下修复系统