C 确保变量声明只发生在作用域块的开头

C 确保变量声明只发生在作用域块的开头,c,gcc,scope,variable-declaration,C,Gcc,Scope,Variable Declaration,我们最近失去了在C编译器上测试代码的能力,因为C编译器要求变量声明发生在作用域块的开头 没过多久,源代码就开始被块中任何地方的声明入侵。这些编码风格的差异在一段时间内没有被注意到,因为我们的警告没有一个能够捕捉到它们。但它们对我们的可移植性目标非常不利 目前正在努力恢复我们的能力,在具有此限制的C编译器上进行连续测试。但同时,我试图找到一些gcc警告标志组合,可以帮助检测它 -std=c90或-pedantic会检测到这种情况,但它们也会产生大量其他不必要的警告。例如,我想授权/注释样式,或枚举

我们最近失去了在C编译器上测试代码的能力,因为C编译器要求变量声明发生在作用域块的开头

没过多久,源代码就开始被块中任何地方的声明入侵。这些编码风格的差异在一段时间内没有被注意到,因为我们的警告没有一个能够捕捉到它们。但它们对我们的可移植性目标非常不利

目前正在努力恢复我们的能力,在具有此限制的C编译器上进行连续测试。但同时,我试图找到一些gcc警告标志组合,可以帮助检测它

-std=c90
-pedantic
会检测到这种情况,但它们也会产生大量其他不必要的警告。例如,我想授权
/
注释样式,或枚举器列表末尾的逗号,或
(…)
可变宏或
长类型。
有时有一种方法可以关闭某些特定的警告(
-Wno long
-Wno variadic macros
),有时我找不到任何(
/
注释样式)


启用一组警告并禁用其中的大部分只是为了保留相关的警告,这听起来很愚蠢。但如果这是唯一的可能性,我可以接受。

-Wdeclaration after statement
是您想要的gcc选项。从手册页面:

在块中的语句后找到声明时发出警告。这 构造,从C++中已知,用ISOC99引入,并由 GCC中允许默认值。它不受ISO C90的支持,也不受支持 GCC 3.0之前的GCC版本支持


-Wdeclaration after语句
是您想要的gcc选项。从手册页面:

在块中的语句后找到声明时发出警告。这 构造,从C++中已知,用ISOC99引入,并由 GCC中允许默认值。它不受ISO C90的支持,也不受支持 GCC 3.0之前的GCC版本支持


混合声明和语句是有效的C语言,因此任何兼容的编译器都应该接受这样的代码。由于它也只是一个风格问题,并且不比块开始时的dclarations更容易出错,因此编译器提供这样的选项将是一个惊喜。毕竟,编译器不是样式检查器。
-Wdeclaration After statement
就是你想要的那种人。@Olaf:从技术上讲,这是毫无疑问的,但我认为“我试图找到一些gcc警告标志组合来帮助检测它”对于jazz来说已经足够接近了。@Olaf:当然,但至少对于gcc来说,它是编译器的一部分。人们仍然需要在C99之前的编译器上编译东西,这绝非不可想象,尽管不可否认的是,允许所有其他东西都会破坏这一目的。但这是一个有效的主题问题,即使想要这样的东西很奇怪。根据我的经验,我处理过一些非常严格的Wind River编译器(不记得几年前的版本了)。如果所有声明都不在函数的开头,它们会抛出错误;对于
/
注释,它们会抛出错误;最奇怪的是,如果每个文件的最后一行没有以换行结束,它们会抛出警告。我浏览了几十个文件,添加了换行符,只是为了抑制这些警告。无论如何,重点是其中一些东西在野外仍然是严格执行的。混合声明和语句是有效的C语言,所以任何兼容的编译器都应该接受这样的代码。由于它也只是一个风格问题,并且不比块开始时的dclarations更容易出错,因此编译器提供这样的选项将是一个惊喜。毕竟,编译器不是样式检查器。
-Wdeclaration After statement
就是你想要的那种人。@Olaf:从技术上讲,这是毫无疑问的,但我认为“我试图找到一些gcc警告标志组合来帮助检测它”对于jazz来说已经足够接近了。@Olaf:当然,但至少对于gcc来说,它是编译器的一部分。人们仍然需要在C99之前的编译器上编译东西,这绝非不可想象,尽管不可否认的是,允许所有其他东西都会破坏这一目的。但这是一个有效的主题问题,即使想要这样的东西很奇怪。根据我的经验,我处理过一些非常严格的Wind River编译器(不记得几年前的版本了)。如果所有声明都不在函数的开头,它们会抛出错误;对于
/
注释,它们会抛出错误;最奇怪的是,如果每个文件的最后一行没有以换行结束,它们会抛出警告。我浏览了几十个文件,添加了换行符,只是为了抑制这些警告。不管怎么说,重点是有些事情在野外仍然严格执行。