プリプロセッサマクロで「sizeof」を使用するにはどうすればいいですか? 質問する

プリプロセッサマクロで「sizeof」を使用するにはどうすればいいですか? 質問する

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);

おすすめ記事