如何修复“在 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 错误?的主要内容,如果未能解决你的问题,请参考以下文章