編集:私はプリプロセッサでsizeof()
を使用できないことを知っています。私は自分のコードを修正したいと考えています。Cプリプロセッサを使用して、可変サイズの(オペレーティングシステムに依存する)16進リテラルを生成するにはどうすればよいですか?
Iは、(タイプunsigned int
の変数内に格納されている)16進数の値を使用するCコードを持って:オペレーティング・システムはunsigned int
を表現することを決定する方法に応じて
0x0000'0000'0000'0001 (64-bit/8 Byte system, 15 0's)
0x0000'0001 (32-bit/4 Byte system, 7 0's)
0x0001 (16-bit/2 Byte system, 3 0's)
0x01 (8-bit /1 Byte system, 1 0's)
を(私が最もOSドンことを認識よそれらを64'bの値として表していますが、私には負担があります)。私は上記の4つの16進数のいずれかをとるオブジェクトマクロを生成したいと思います。これは、OSがどのように実装するかによって異なります。unsigned int
。
#define SYS_UINT_TYPE sizeof(unsigned int)
#if SYS_UINT_TYPE == 8
#define DEFAULT_MASK 0x0000000000000001
#elif SYS_UINT_TYPE == 4
#define DEFAULT_MASK 0x00000001
...
#endif
しかし##
(C連結演算子を使用する方法がある場合、私は思っていた:これを行うには
簡単な(デッド数える)の方法は、if-else文のシリーズを使用することです)正しい0を連結して正しいDEFAULT_MASK
マクロ展開値を生成します。私はB
バイトシステムの場合、テキストリテラル0x
と連結する必要がある0の数は2B-1
ですが、For-loop
プリプロセッサディレクティブのようなものではありません。
実際には、これは入力する必要がある#if ... #elif ... #endif
のサイズを縮小するために機能します。
リテラルを符号なしのintとして宣言し、その値に '1'の値を割り当てます(その前に' 0x'は必要ありません)。 Voila!完了しました。これは、コンパイルしたすべてのプラットフォーム上のunsigned intに適したサイズになります。視覚の中に一つの '#if'もありません。 –
それはうまくいく、ケン。ありがとう。 可能であれば、一連のプリプロセッサ連結を実行する方法を尋ねることは、この質問の範囲に含まれていますか? –
*この質問の範囲*?いいえ、これはこれとは無関係の全く別の質問です。最初にここで検索して以前に尋ねられているかどうかを調べます(それが疑わしいので、徹底的に検索します)。新しい質問を作成してそこに質問していない場合は検索してください。 –