9

c ++でこのようなことを行う方法はありますか?何らかの理由で sizeof を使用できないようです?

#if sizeof(wchar_t) != 2
#error "wchar_t is expected to be a 16 bit type."
#endif
4

7 に答える 7

15

いいえ、これはできません。すべてのマクロ展開 (#... など) は、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 内のものにのみアクセスして使用できます。

于 2009-08-02T15:50:52.663 に答える
8

プリプロセッサは、組み込み型であっても、型について何も知らずに動作します。

ところで、static_assert のような機能を使用してチェックを行うことはできます (たとえば、boost には 1 つがあり、C++0X には 1 つがあります)。

編集: C99 と C++0X にはマクロもWCHAR_MINありますWCHAR_MAX<stdint.h>

于 2009-08-02T15:51:32.537 に答える
4

BOOST_STATIC_ASSERTなどが役立つと思います。

于 2009-08-02T16:15:45.753 に答える
3

sizeof() はランタイムコンパイル時関数です。プリプロセッサ ディレクティブでそれを呼び出すことはできません。前処理中に wchar_t のサイズを確認できないと思います。(編集2を参照)

編集:コメントで指摘されているように、 sizeof() はほとんどコンパイル時に計算されます。C99 では、配列の実行時に使用できます

編集 2: このスレッドで説明されている手法を使用して、ビルド時にアサートを行うことができます。

于 2009-08-02T15:51:27.823 に答える
3

C_ASSERT を使用すると、基本的に必要なもの (派手なメッセージなしのコンパイル エラー) が得られませんか?

#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
于 2009-08-02T16:27:18.050 に答える
1
char _assert_wchar_t_is_16bit[ sizeof(wchar_t) == 2 ? 1 : -1];
于 2009-08-02T16:18:53.233 に答える