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

时间:2008-08-24 06:30:10

标签: c gcc for-loop

我正在尝试解决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模式是什么。有什么想法吗?

11 个答案:

答案 0 :(得分:142)

我会尝试在循环之外声明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 here中的for循环。

答案 1 :(得分:112)

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

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

答案 2 :(得分:20)

要在 CodeBlocks 中切换到 C99 模式,请执行以下步骤:

单击项目/构建选项,然后在选项卡编译器设置中选择子选项卡其他选项,并在文本中放置-std=c99区域,然后单击确定

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

我希望这能帮助别人!

答案 3 :(得分:14)

我也遇到了这个错误。

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

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

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

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

答案 4 :(得分:13)

@Blorgbeard

C99中的新功能

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

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

A Tour of C99

答案 5 :(得分:5)

如果你在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

答案 6 :(得分:1)

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

int i;

for(i = low; i <= high; ++i)

{
        res = runalg(i);
        if (res > highestres)
        {
                highestres = res;
        }

}

答案 7 :(得分:1)

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

export CFLAGS="-std=c99"

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

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

答案 8 :(得分:1)

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

  • 转到 设置 -> 编译器...
  • 编译器设置 标签的 编译器标志 部分中,选中复选框“ 具有gcc遵循1999 ISO C语言标准[-std = c99] '

答案 9 :(得分:0)

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

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99

答案 10 :(得分:0)

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...