unsigned volatile long Vs volatile unsigned long

时间:2013-06-13 12:41:11

标签: c gcc

我今天遇到了一个代码,其中特定的硬件地址是类型转换为

unsigned volatile long * 

我知道它可以是volatile unsigned longunsigned long volatile;这是定义volatile的另一种方式,还是代码中的错误?

我启用了警告,并惊讶地看到没有警告。我使用的是GCC-4.7.0

2 个答案:

答案 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 *