我今天遇到了一个代码,其中特定的硬件地址被强制转换为
unsigned volatile long *
我知道它可以是volatile unsigned long
或unsigned long volatile
;这是另一种定义方式volatile
还是代码中的错误?
我启用了警告并惊讶地发现没有警告。我使用的是 GCC-4.7.0
这只是另一种方式,没有语义差异。
C 语言允许类型说明符( int, unsigned, char, signed, void
etc)、类型限定符( volatile, const
etc) 和存储类说明符( static, extern
etc) 相互组合,以任意顺序编写。它们都是所谓的“声明说明符”,顺序无关紧要。
但是,在 C 标准 (C11 6.11) 的未来方向中,声明在未来:"The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature."
因此,您应该始终在声明的开头编写存储类说明符。不这样做的代码不能保证在 C 标准的未来版本中编译。
我想说,正因为如此,总是按顺序编写说明符是一种很好的编程风格[storage-class specifiers] [type qualifiers] [type specifiers]
,并且永远不要混合这三种类型。
编写声明的最正确方法是:
volatile unsigned long *
或者,如果您想不必要地冗长:
auto volatile unsigned long *