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

The*_*i.9 114 c gcc for-loop

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

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

        }
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我尝试使用GCC编译时,我收到此错误:

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

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

Oys*_*erD 147

我试着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;
}
Run Code Online (Sandbox Code Playgroud)

这里阅读更多关于C中for循环的内容.

  • @ErikW你的问题非常糟糕 (3认同)

Jam*_*rue 114

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

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

  • 实际上-std = gnu99可能更合适,因为你仍然可以获得gcc扩展(gcc默认为-std = gnu89,但是在接下来的几个版本中,这将在某个时候改为gnu99) (7认同)
  • @ Spudd86:你是否*想*启用gcc扩展取决于你正在做什么.如果您的目标是编写可移植到gcc以外的编译器的代码,那么禁用它们会很有帮助. (3认同)

ake*_*lec 21

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

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

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

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


Blo*_*ard 14

我也得到了这个错误.

for (int i=0;i<10;i++) { ..
Run Code Online (Sandbox Code Playgroud)

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

int i;
for (i=0;i<10;i++) { ..
Run Code Online (Sandbox Code Playgroud)

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

  • 对于gcc,抛出一个"-std = c99".有关其他功能,请参阅Imran的答案. (3认同)

Imr*_*ran 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++) { ..
Run Code Online (Sandbox Code Playgroud)

int i;
for (i=0;i<10;i++) { ..
Run Code Online (Sandbox Code Playgroud)

您也可以使用C99开关组进行编译.在编译行中输入-std = c99:

gcc -std=c99 foo.c -o foo
Run Code Online (Sandbox Code Playgroud)

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


Min*_*ink 6

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

export CFLAGS="-std=c99"
Run Code Online (Sandbox Code Playgroud)

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

export CXXFLAGS="-std=c++11"
Run Code Online (Sandbox Code Playgroud)