2009-08-02 7 views
7

C++でこれを行うにはいくつかの方法がありますが、何らかの理由でsizeof cantが使用されるようですか?C++マクロで型のサイズを取得する

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

あなたの質問のおかげで、ビルドアサーションが可能であることを学びました。このテクニックについては、このスレッドで詳しく説明しています。http://stackoverflow.com/questions/174356/ways-to-assert-expressions-at-build-time-in-c – nagul

答えて

4

にもWCHAR_MINWCHAR_MAXマクロを持って、私はBOOST_STATIC_ASSERTのようなものを助けることができると思います。

14

すべてのマクロ展開(#...物事が)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で物事をのみアクセスして使用することができます。

+0

現在、プリプロセッサは時々存在しません。 –

+0

@Cole Johnson:プリプロセッサを完全に省略している人はいません。プリプロセッサなしでCまたはC++コンパイラを知っていますか? – mmmmmmmm

+0

私が知っているわけではありません。私は '#pragma'のようなものを指していた –

3

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

編集:コメントで指摘したように、はsizeof()はコンパイル時に計算ほとんどです。 C99では、it can be used at runtime for arrays

編集2:このthreadに記載されている手法を使用して、ビルド時にアサーションを行うことができます。

+7

sizeof()はランタイム関数ではありません。これはコンパイル時にコンパイラによって評価されるコンパイル時の式です(プリプロセッサ時間後)。 – mmmmmmmm

+0

ありがとう、それを認識していませんでした。それに応じて更新。 – nagul

+1

@nagul:そうです、いつもコンパイル時の式ではないかもしれません:-) – mmmmmmmm

7

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

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

編集:C99およびC++ 0Xが<stdint.h>

1
char _assert_wchar_t_is_16bit[ sizeof(wchar_t) == 2 ? 1 : -1]; 
3

あなたはC_ASSERTを使用して(W/O空想メッセージコンパイルエラー)あなたが欲しいものを基本的に取得していないでしょうか?

#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1] 
0

マクロ条件内でsizeofを効果的に使用できるようにするマクロをいくつか開発しました。それらは私がhere(MITライセンス)をア​​ップロードしたヘッダーファイルにあります。

それは、このようなコードのために許可されます:

#include <iostream> 
#include "SIZEOF_definitions.h" 

//You can also use SIZEOF_UINT in place of SIZEOF(unsigned, int) 
// and UINT_BIT in place of SIZEOF_BIT(unsigned, int) 
#if SIZEOF(unsigned, int) == 4 
int func() { return SIZEOF_BIT(unsigned, int); } 
#elif SIZEOF(unsigned, int) == 8 
int func() { return 2 * SIZEOF_BIT(unsigned, int); } 
#endif 

int main(int argc, char** argv) { 
    std::cout SIZEOF(unsigned, long, int) << " chars, #bits = " << SIZEOF_BIT(unsigned, long, int) << '\n' 
     << SIZEOF(unsigned, int)  << " chars, #bits = " << SIZEOF_BIT(unsigned, int)  << '\n' 
     << SIZEOF(int)     << " chars, #bits = " << SIZEOF_BIT(int)     << '\n'; 
    std::cout << func() << std::endl; 
    return 0; 
} 

SIZEOF(unsigned, long, int)内カンマを注意してください。

関連する問題