3

我今天遇到了一个代码,其中特定的硬件地址被强制转换为

unsigned volatile long * 

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

我启用了警告并惊讶地发现没有警告。我使用的是 GCC-4.7.0

4

2 回答 2

2

这只是另一种方式,没有语义差异。

于 2013-06-13T12:44:27.550 回答
0

C 语言允许类型说明符( int, unsigned, char, signed, voidetc)、类型限定符( volatile, constetc) 和存储类说明符( static, externetc) 相互组合,以任意顺序编写。它们都是所谓的“声明说明符”,顺序无关紧要。

但是,在 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 *
于 2013-06-13T13:23:55.827 回答