【问题标题】:Is there any way to enable for(int i=0; ... in gcc without having to turn on c99 mode有没有办法在 gcc 中启用 for(int i=0; ... 而不必打开 c99 模式
【发布时间】:2012-02-28 19:33:21
【问题描述】:

我有一个非常大的程序,它用 gcc 编译而没有警告。

如果我在命令行上打开 c99 模式 --std=c99,它会给出大量的警告和错误。

但我喜欢成语for(int i=0; i<20; i++){ code }

代替{int i; for (i=0; i<20; i++){ code }}

有没有办法告诉 gcc 只允许这个并且只允许这个?

或者,有没有办法在我正在处理的特定功能中启用 c99 模式?像

#pragma c99 on 

for(int i=0; i<99; i++)
{
    code
}

#pragma c99 off

【问题讨论】:

  • ANSI C 禁止混合声明和声明是有原因的。您应该在函数顶部声明所有变量,仅此而已。如果你害怕丢失或混合它们,你的函数有太多行,你应该分段它。
  • 当您尝试在gnu99 模式下(而不是c99)编译代码会发生什么?
  • 此评论代表“投票反对”埃瑞格里斯的。 C89 允许您在 any 块的顶部定义变量,而不仅仅是 Eregrith 的样式指南要求的函数体,这是有充分理由的。很少有其他语言和极少数现代语言有这样的要求也是有充分理由的。不要遵循 Eregrith 的风格,即使在 C89 中也是如此。 C89 禁止混合定义和其他语句的原因是一个非常薄弱的​​原因——它在 1989 年之前基本上是历史性的,并且与以非常简单的方式放置堆栈帧的笨重的旧编译器有关。
  • 摆脱错误和警告。使用-std=c99 -pedantic -Wall -Wextra -Werror 编译可以让您对代码有很好的可移植性 --- 如果您需要将其移动到另一个编译器或计算机或其他任何东西,它就可以工作:)
  • @pmg: 只要你不需要使用微软的编译器。如果这样做,那么“安全”的方法是将-std=c99 更改为-std=c89,并放弃使用C99 功能,包括这个。

标签: c gcc for-loop c99 pragma


【解决方案1】:

警告和错误很可能是因为-std=c99 请求符合标准的C99,这意味着许多污染C99 命名空间的特定于平台的函数没有定义。

相反,您应该尝试--std=gnu99,这是 C99 等效于默认模式 gnu89

【讨论】:

  • 或者更好的是,使用-std=c99,然后为您想要使用的东西定义正确的功能测试宏(可能是-D_XOPEN_SOURCE=700)。
【解决方案2】:

您也可以使用 -std=gnu99 禁用个别警告:

-Wno-declaration-after-statement

阅读信息 gcc

`-Wdeclaration-after-statement (C and Objective-C only)' 在块中的语句之后发现声明时发出警告。 这个结构,从 C++ 中知道,是随 ISO C99 引入的,是 默认情况下在 GCC 中允许。 ISO C90 不支持它,并且是 GCC 3.0 之前的 GCC 版本不支持。 *注意混合 声明::.

【讨论】:

  • 问题在于,当您处于 c89 模式时,这是一个错误,而不是警告。
猜你喜欢
  • 2013-04-24
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 2014-10-23
  • 2011-05-21
相关资源
最近更新 更多