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


116

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

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

        }

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

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

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

Answers:


148

我会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循环的更多信息


那你为什么不使用while循环呢?
Erik W

3
@ErikW您的问题非常糟糕
user25

118

有一个启用C99模式的编译器开关,除其他外,它还允许在for循环内声明变量。要打开它,请使用编译器开关-std=c99

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


7
实际上-std = gnu99可能是更可取的,因为那样一来,您仍然可以获得gcc扩展名(gcc默认为-std = gnu89,但是在接下来的几个版本中,它将在某些时候更改为gnu99)
Spudd86 2010年

3
@ Spudd86:是否启用gcc扩展取决于您在做什么。如果您的目标是编写可移植给gcc以外的编译器的代码,则禁用它们会有所帮助。
Keith Thompson

21

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

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

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

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


这有助于“ 其他编译器”选项下的代码块16.1 !虽然我-std=gnu99按照上面的一些答案中的描述使用了!
Ankur Shah

但这暂时帮助了!我每次编译代码时都必须这样做!... :(
Ankur Shah

不,你没有!每个新项目只能执行一次。
akelec '16

14

我也遇到了这个错误。

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

在C89 / C90标准中无效。正如OysterD所说,您需要执行以下操作:

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

C99和更高版本的C语言允许使用您的原始代码。


3
对于gcc,将其抛出“ -std = c99”。有关其他功能,请参见Imran的答案。
Matt J

是的,它是有效的C;这只是无效的C89 / C90。
Keith Thompson

@KeithThompson:已澄清。
Blorgbeard在

您仍然说它不是有效的C,仅具有资格。它是完全有效的C;1999年的标准取代了1990年的标准,而2011年的标准取代了1999年的标准(尽管当您最初发布此答案时,后者不存在)。
基思·汤普森

@KeithThompson好吧,那不是我想说的。您是否认为“在C89 / C90标准中无效”是正确的?
Blorgbeard在

13

@Blorgbeard

C99的新功能

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

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

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


3

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

export CFLAGS="-std=c99"

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

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

1

我遇到了同样的问题,但您只需要声明i循环的外部即可:

int i;

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

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

}

1

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

1

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

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

0

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

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.