126

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

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

        }

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

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

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

4

11 回答 11

158

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

于 2008-08-24T06:31:16.480 回答
124

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

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

于 2008-08-24T06:46:57.647 回答
23

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

单击Project/Build options,然后在选项卡Compiler Settings中选择子选项卡Other options,然后放置-std=c99在文本区域中,然后单击Ok

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

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

于 2014-12-01T09:57:45.133 回答
14

我也遇到了这个错误。

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

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

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

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

于 2008-08-24T06:50:00.430 回答
13

@Blorgbeard

C99 中的新功能

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

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

C99 之旅

于 2008-08-25T11:41:45.307 回答
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

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

于 2013-04-08T05:25:12.593 回答
4

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

export CFLAGS="-std=c99"

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

export CXXFLAGS="-std=c++11"
于 2018-06-27T15:37:50.840 回答
2

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...
于 2018-10-07T06:51:25.777 回答
2

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

  • 转到设置->编译器...
  • 在编译器设置选项卡的编译器标志部分中,选中复选框“让 gcc 遵循 1999 ISO C 语言标准 [-std=c99]
于 2019-07-29T10:57:10.660 回答
1

我有同样的问题,它工作你只需要声明i循环的外部:

int i;

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

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

}
于 2013-09-12T22:57:47.363 回答
0

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

QMAKE_CFLAGS_DEBUG = \
    -std=gnu99

QMAKE_CFLAGS_RELEASE = \
    -std=gnu99
于 2013-05-29T14:27:19.217 回答