【发布时间】: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 功能,包括这个。