【问题标题】:C: for loop int initial declarationC: for loop int 初始声明
【发布时间】:2010-11-20 05:55:09
【问题描述】:

有人可以详细说明以下 gcc 错误吗?

$ gcc -o Ctutorial/temptable.out temptable.c 
temptable.c: In function ‘main’:
temptable.c:5: error: ‘for’ loop initial declaration used outside C99 mode

temptable.c:

...
/* print Fahrenheit-Celsius Table */
main()
{
    for(int i = 0; i <= 300; i += 20)
    {
        printf("F=%d C=%d\n",i, (i-32) / 9);        
    }
}

P.S:我隐约记得 int i 应该在 for 循环之前声明。我应该声明,我正在寻找一个给出 C 标准历史背景的答案。

【问题讨论】:

  • 查看上一个与 C 变量声明相关的问题以获取更多信息:stackoverflow.com/questions/288441/…
  • 注意温度换算公式不正确;在整数算术中,它应该是(5 * (i - 32)) / 9(缺少5)。通常,您需要浮点运算 - 但随后您需要将 printf 格式从 C=%d 更改为 C=%./2f 或类似的东西(并且您使用 (5.0 * (i - 32)) / 9.0 进行转换)。

标签: c for-loop gcc syntax-error


【解决方案1】:
for (int i = 0; ...) 

是在 C99 中引入的语法。为了使用它,您必须通过将-std=c99(或更高版本的标准)传递给 GCC 来启用 C99 模式。 C89版本是:

int i;
for (i = 0; ...)

编辑

从历史上看,C 语言总是强制程序员在块的开头声明所有变量。所以像:

{
   printf("%d", 42); 
   int c = 43;  /* <--- compile time error */

必须改写为:

{
   int c = 43;
   printf("%d", 42);

块定义为:

block := '{' declarations statements '}'

C99、C++、C# 和 Java 允许在块中的任何位置声明变量。

真正的原因(猜测)是关于在解析 C 源代码时尽快分配内部结构(如计算堆栈大小),而无需再进行编译。

【讨论】:

  • 请注意:使用c99版本时,不要忘记声明的变量是for循环块的局部变量,当它超出范围时将不存在。
  • 可能具有历史意义的附加说明。在 C99 标准之前绕过此规则的一种方法是在块中创建块。您可以在块的中间声明一个变量,并用更多的括号将它和使用它的代码包围起来 {}
  • 还值得一提的是,例如,在新版本的 GCC 上,C 的默认版本更新为比 C89 更新的版本 --> 所以整个问题不会产生编译错误首先...(我在 Ubuntu 16.04 上使用 gcc 5.4.0,并且没有任何编译错误,也没有针对此 sn-p 代码的警告)。
  • 如果有人真的想用编译器标志-std=c89 进行实验,只需添加一个词:不要忘记添加-pedantic 以要求编译器认真。
【解决方案2】:

在 C99 之前,您必须在块的开头定义局部变量。 C99 引入了 C++ 特性,可以将局部变量定义与指令混合,并且可以在for 和while 控制表达式中定义变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2016-06-03
    • 1970-01-01
    • 2014-08-26
    • 2021-01-17
    相关资源
    最近更新 更多