次のように、型変換をシンボリック定数/マクロに含めることが適切なのはいつですか。
#define MIN_BUF_SIZE ((size_t) 256)
型チェックを使用して、実際の変数のように動作させるための良い方法ですか?
L
またはU
(またはLL
)接尾辞を使用するのが適切なのはいつですか。#define NBULLETS 8U #define SEEK_TO 150L
4 に答える
デフォルトのタイプが適切でない場合はいつでもそれを行う必要があります。それでおしまい。
自動変換が適用されない場所、特に可変引数リストを持つ関数では、定数の入力が重要になる場合があります。
printf("my size is %zu\n", MIN_BUF_SIZE);
int
との幅が異なると簡単にクラッシュする可能性がsize_t
あり、キャストを行いません。
しかし、マクロには改善の余地があります。私はそれをします
#define MIN_BUF_SIZE ((size_t)+256U)
(小さな+
看板がありますか?)
そのように指定された場合でも、マクロはプリプロセッサ式で使用できます(を使用#if
)。これは、プリプロセッサでが(size_t)
評価され0
、結果が符号なし256
であるためです。
定数の型を明示的に示すことは、カーニハンとリッチーCでより関連性がありました(ANSI /標準Cとその関数プロトタイプが登場する前)。
現在のような関数プロトタイプdouble fabs(double value);
により、コンパイラーは必要に応じて適切な型変換を生成できます。
場合によっては、定数サイズを明示的に指定する必要があります。今頭に浮かぶ例はビットマスクです。
#define VALUE_1 ((short) -1)
16ビット長であるのに対し#define VALUE_2 ((char) -1)
、8ビットである可能性があります。したがって、を指定するとlong x
、結果は大きく異なります。x & VALUE_1
x & VALUE_2
- これは、LまたはLLサフィックスの場合にも当てはまります。定数は異なるビット数を使用します。