6
  1. 次のように、型変換をシンボリック定数/マクロに含めることが適切なのはいつですか。

    #define MIN_BUF_SIZE ((size_t) 256)
    

    型チェックを使用して、実際の変数のように動作させるための良い方法ですか?

  2. LまたはU(またはLL)接尾辞を使用するのが適切なのはいつですか。

    #define NBULLETS 8U
    #define SEEK_TO 150L
    
4

4 に答える 4

4

デフォルトのタイプが適切でない場合はいつでもそれを行う必要があります。それでおしまい。

于 2012-11-22T17:04:24.823 に答える
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であるためです。

于 2012-11-22T17:52:47.500 に答える
0

#define単なるトークン貼り付けプリプロセッサです。

何を書いて#defineも、コンパイル前に置換テキストに置き換えられます。

どちらの方法も正しいです

#define A a

int main
{
 int A; // A will be replaced by a
}

可変個引数マクロ複数行マクロ#defineなどには多くのバリエーションがあります

しかし、の主な目的は#define上で説明した唯一のものです。

于 2012-11-22T17:12:04.167 に答える
0

定数の型を明示的に示すことは、カーニハンとリッチーCでより関連性がありました(ANSI /標準Cとその関数プロトタイプが登場する前)。

現在のような関数プロトタイプdouble fabs(double value);により、コンパイラーは必要に応じて適切な型変換を生成できます。

場合によっては、定数サイズを明示的に指定する必要があります。今頭に浮かぶ例はビットマスクです。

  • #define VALUE_1 ((short) -1)16ビット長であるのに対し#define VALUE_2 ((char) -1)、8ビットである可能性があります。したがって、を指定するとlong x、結果は大きく異なります。x & VALUE_1x & VALUE_2

    • これは、LまたはLLサフィックスの場合にも当てはまります。定数は異なるビット数を使用します。
于 2012-11-22T17:23:52.620 に答える