2011-08-11 14 views
5

固定幅の整数を使用してコードを移植性の高いものにすることについて読んでいました。私は物事を説明する助けthis記事を見つけ、そして最後に、それはtypedefでのエラーを検出し、報告するには、この匿名組合を使用して示唆している:私は少し迷ってしまいましたtypedefエラーの検出と報告...これは何をするのですか?

static union 
{ 
    char int8_t_incorrect[sizeof( int8_t) == 1]; 
    char uint8_t_incorrect[sizeof(uint8_t) == 1]; 
    char int16_t_incorrect[sizeof(int16_t) == 2]; 
    char uint16_t_incorrect[sizeof(uint16_t) == 2]; 
    char int32_t_incorrect[sizeof(int32_t) == 4]; 
    char uint32_t_incorrect[sizeof(uint32_t) == 4]; 
}; 

をし、私は誰かがこれが何をしているか説明できる期待していました?

答えて

4

これはコンパイラを酷使しています。

基本的にsizeof(type) == numはコンパイル時に評価されており、0または1(falseまたはtrue)のいずれかが生成されます。それが0であれば、コンパイルエラーが発生します。これは、サイズゼロの配列を宣言することができないためです。

しかし、これはコンパイラにはかなり嫌なものであり、ほとんどのsaneビルド環境では、typedefが正しいことが保証されています(autoconfには、このような種類のマクロが組み込まれています)。

+0

さえ埋め込まれたコンパイラは、私は、これが「虐待」がどのように表示されていない –

+0

ああ、私が見るには、説明のためのおかげでそんなに記事が書かれたとき、彼らがいたよりも少し賢くています。無意味な、おそらく。 – Morgan

+1

今、それは簡単なようで...、2004 –

4

それらの等価性チェックのいずれかの場合には、労働組合が許可されていないと、コンパイルエラーになりますこれは、0の配列サイズでフィールドを持っていることを偽になります。

+0

おかげで、あなたの応答2つ目は私のために明確なそれを助けました。 – Morgan

関連する問題