【发布时间】:2016-05-05 01:54:10
【问题描述】:
我们最近失去了在 C 编译器上测试代码的能力,这些代码需要在作用域块的开头进行变量声明。
没过多久,源代码就开始被任何块中的任何地方的声明侵入。这些编码风格的差异有一段时间没有被注意到,因为我们的任何警告都无法捕捉到它们。但它们对我们的可移植性目标非常不利。
我们正在努力恢复我们在具有此限制的 C 编译器上进行连续测试的能力。但与此同时,我尝试找到一些可以帮助检测它的 gcc 警告标志组合。
-std=c90 或 -pedantic 会检测到这种情况,但它们也会产生大量其他不需要的警告。例如,我想授权// 注释样式,或枚举器列表末尾的逗号,或(...) 可变参数宏或long long 类型。
有时有办法关闭某些特定警告(-Wno-long-long 或 -Wno-variadic-macros),有时我找不到任何警告(// 评论风格)。
启用一组警告并禁用其中大部分以保留相关警告听起来很愚蠢。但如果这是唯一的可能性,我可以接受。
【问题讨论】:
-
混合声明和语句是有效的 C,所以任何兼容的编译器都应该接受这样的代码。由于这也只是一种风格问题,并且不会比块开头的声明更容易出错,因此编译器提供这样的选项将是令人惊讶的。毕竟,编译器不是样式检查器。
-
-Wdeclaration-after-statement是你想要的人。 -
@Olaf:技术上没有问题,但我认为“我试图找到一些可以帮助检测它的 gcc 警告标志组合”对于爵士乐来说已经足够接近了。
-
@Olaf:当然,但它是编译器的一部分,至少对于 gcc。人们仍然需要在 C99 之前的编译器上编译的东西远不是不可想象的,尽管承认允许所有其他的东西有点违背了那里的目的。但这是一个有效的、切题的问题,即使想要这样的东西很奇怪。
-
仅凭我的经验,我处理过一些非常严格的 Wind River 编译器(不记得几年前的版本了)。如果所有声明都不是在函数的开头,它们会抛出错误,会抛出
//cmets 的错误,最奇怪的是,如果每个文件的最后一行没有以换行符结尾,它们会抛出警告.我浏览了几十个添加换行符的文件,只是为了抑制这些警告。无论如何,重点是其中一些事情在野外仍然严格执行。
标签: c gcc scope variable-declaration