c ++でこのようなことを行う方法はありますか?何らかの理由で sizeof を使用できないようです?
#if sizeof(wchar_t) != 2
#error "wchar_t is expected to be a 16 bit type."
#endif
いいえ、これはできません。すべてのマクロ展開 (#... など) は、C++ コードの型について何も知らず、言語についても何も知らなくてもよいプリプロセッサ ステップで行われるためです。 ! #... を展開/チェックするだけで、他には何もありません!
他にもいくつかの一般的なエラーがあります。たとえば、次のとおりです。
enum XY
{
MY_CONST = 7,
};
#if MY_CONST == 7
// This code will NEVER be compiled because the pre-processor does not know anything about your enum!
#endif //
コンパイラへのコマンド ライン オプションまたは #define を介して定義されている #if 内のものにのみアクセスして使用できます。
プリプロセッサは、組み込み型であっても、型について何も知らずに動作します。
ところで、static_assert のような機能を使用してチェックを行うことはできます (たとえば、boost には 1 つがあり、C++0X には 1 つがあります)。
編集: C99 と C++0X にはマクロもWCHAR_MIN
ありますWCHAR_MAX
<stdint.h>
BOOST_STATIC_ASSERTなどが役立つと思います。
sizeof() はランタイムコンパイル時関数です。プリプロセッサ ディレクティブでそれを呼び出すことはできません。前処理中に wchar_t のサイズを確認できないと思います。(編集2を参照)
編集:コメントで指摘されているように、 sizeof() はほとんどコンパイル時に計算されます。C99 では、配列の実行時に使用できます。
編集 2: このスレッドで説明されている手法を使用して、ビルド時にアサートを行うことができます。
C_ASSERT を使用すると、基本的に必要なもの (派手なメッセージなしのコンパイル エラー) が得られませんか?
#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
char _assert_wchar_t_is_16bit[ sizeof(wchar_t) == 2 ? 1 : -1];