C++でこれを行うにはいくつかの方法がありますが、何らかの理由でsizeof cantが使用されるようですか?C++マクロで型のサイズを取得する
#if sizeof(wchar_t) != 2
#error "wchar_t is expected to be a 16 bit type."
#endif
C++でこれを行うにはいくつかの方法がありますが、何らかの理由でsizeof cantが使用されるようですか?C++マクロで型のサイズを取得する
#if sizeof(wchar_t) != 2
#error "wchar_t is expected to be a 16 bit type."
#endif
にもWCHAR_MIN
とWCHAR_MAX
マクロを持って、私はBOOST_STATIC_ASSERTのようなものを助けることができると思います。
すべてのマクロ展開(#...物事が)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で物事をのみアクセスして使用することができます。
現在、プリプロセッサは時々存在しません。 –
@Cole Johnson:プリプロセッサを完全に省略している人はいません。プリプロセッサなしでCまたはC++コンパイラを知っていますか? – mmmmmmmm
私が知っているわけではありません。私は '#pragma'のようなものを指していた –
sizeof()は、
ランタイム
のコンパイル時関数です。プリプロセッサディレクティブで呼び出すことはできません。
前処理中にwchar_tのサイズを確認できないと思います。
(編集2を参照)
編集:コメントで指摘したように、はsizeof()はコンパイル時に計算ほとんどです。 C99では、it can be used at runtime for arrays。
編集2:このthreadに記載されている手法を使用して、ビルド時にアサーションを行うことができます。
プリプロセッサは、組み込み型であっても、型について何も知らなくても動作します。
ところで、あなたはまだstatic_assertのような機能を使用してチェックを行うことができます(ブーストには1つがあり、例えばC++ 0Xには1つあります)。
編集:C99およびC++ 0Xが<stdint.h>
char _assert_wchar_t_is_16bit[ sizeof(wchar_t) == 2 ? 1 : -1];
あなたはC_ASSERTを使用して(W/O空想メッセージコンパイルエラー)あなたが欲しいものを基本的に取得していないでしょうか?
#define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1]
マクロ条件内で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)
内カンマを注意してください。
あなたの質問のおかげで、ビルドアサーションが可能であることを学びました。このテクニックについては、このスレッドで詳しく説明しています。http://stackoverflow.com/questions/174356/ways-to-assert-expressions-at-build-time-in-c – nagul