sizeof
プリプロセッサマクロで を使用する方法はありますか?
たとえば、私はこれまで何年もの間、次のようなことをしたいと思ったことが何度もありました。
#if sizeof(someThing) != PAGE_SIZE
#error Data structure doesn't match page size
#endif
ここで私がチェックしている正確な内容は完全に架空のものです。要点は、誰かがデータ構造を変更して位置ずれやサイズ変更を起こし、データ構造を壊してしまうのを防ぐために、このような種類の(サイズや配置の)コンパイル時チェックを頻繁に入れたいということです。
言うまでもなく、sizeof
上記の方法で を使用することはできないようです。
ベストアンサー1
sizeof(someThing)
これを行うにはいくつかの方法があります。次のスニペットは、等しい場合はコードを生成しませんPAGE_SIZE
。それ以外の場合はコンパイル時エラーを生成します。
1. C11ウェイ
C11以降では、static_assert
(必要#include <assert.h>
)。
使用法:
static_assert(sizeof(someThing) == PAGE_SIZE, "Data structure doesn't match page size");
2. カスタムマクロ
sizeof(something)
期待どおりでない場合にコンパイル時エラーを取得したい場合は、次のマクロを使用できます。
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
使用法:
BUILD_BUG_ON( sizeof(someThing) != PAGE_SIZE );
この記事なぜそれが機能するのかを詳しく説明します。
3. MS固有
Microsoft C++コンパイラでは、C_アサートマクロ ( が必要#include <windows.h>
) では、セクション 2 で説明したトリックと同様のトリックが使用されます。
使用法:
C_ASSERT(sizeof(someThing) == PAGE_SIZE);