我今天遇到了一个代码,其中特定的硬件地址是类型转换为
unsigned volatile long *
我知道它可以是volatile unsigned long
或unsigned long volatile
;这是定义volatile
的另一种方式,还是代码中的错误?
我启用了警告,并惊讶地看到没有警告。我使用的是GCC-4.7.0
答案 0 :(得分:2)
这只是另一种方式,没有语义差异。
答案 1 :(得分:0)
C语言允许类型说明符(int, unsigned, char, signed, void
等),类型限定符(volatile, const
等)和存储类说明符< / em>(static, extern
etc)彼此组合,以任何顺序书写。他们都是所谓的&#34;声明说明者&#34;并且顺序无关紧要。
然而,在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]
的顺序编写说明符是好的编程风格,永远不要混合3种类型。
编写声明的最恰当方式是:
volatile unsigned long *
或者如果你想要不必要的冗长:
auto volatile unsigned long *