3

今日、特定のハードウェア アドレスが型キャストされているコードに出くわしました

unsigned volatile long * 

私はそれができることを知っていvolatile unsigned longます unsigned 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]このため、常に指定子を の順序で記述し、3 つの型を混在させないのが良いプログラミング スタイルであると言えます。

宣言を記述する最も適切な方法は次のとおりです。

volatile unsigned long *

または、不必要に冗長になりたい場合は、次のようにします。

auto volatile unsigned long *
于 2013-06-13T13:23:55.827 に答える