今日、特定のハードウェア アドレスが型キャストされているコードに出くわしました
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]
このため、常に指定子を の順序で記述し、3 つの型を混在させないのが良いプログラミング スタイルであると言えます。
宣言を記述する最も適切な方法は次のとおりです。
volatile unsigned long *
または、不必要に冗長になりたい場合は、次のようにします。
auto volatile unsigned long *