5

ここでも、32ビットアプリを64ビットに移植します。下記のC_ASSERTステートメントで負の添え字エラーが発生します。


C_ASSERT (sizeof(somestruct) == some#define);

http://support.microsoft.com/kb/68475の記事も読みましたが、この場合の修正方法がわからないのです。

ヘルプをいただければ幸いです。

前もって感謝します。

4

1 に答える 1

14

C_ASSERTマクロは次のように定義されていると思います。

#define C_ASSERT(x) typedef char C_ASSERT_ ## __COUNTER__ [(x) ? 1 : -1];

これはコンパイル時のアサーションです。コンパイル時の式xが true の場合、これは次のように展開されます。

typedef char C_ASSERT_1[1];

typenameC_ASSERT_1が型のエイリアスであることを宣言しますchar[1]( 1 の配列char)。逆に、式xが false の場合、次のように展開されます。

typedef char C_ASSERT_1[-1];

負のサイズの配列型を持つことはできないため、これはコンパイラ エラーです。

したがって、問題は式sizeof(somestruct) == some#defineが false であることです。つまり、 のサイズがsomestructコードが期待するものではありません。これを修正する必要があります -- のサイズを変更するかsomestruct、 の値を変更しsome#defineて、これによって何も壊れないようにします。

于 2009-09-26T21:53:08.793 に答える