技術共有

「C言語」の前処理

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. 定義済みのシンボル

C 言語は、直接使用して前処理中に処理できるいくつかの事前定義されたシンボルを設定します。

__FILE__//进行编译的源文件
__LINE__//文件当前的行号
__DATE__//文件被编译的日期
__TIME__//文件被编译的时间
__STDC__//如果编译器遵循ANSI C,其值为1,否则未定义
  • 1
  • 2
  • 3
  • 4
  • 5

試験結果:
ここに画像の説明を挿入します

2. #define は定数を定義します

#define は、定数を定義するときに定義を記述するために使用されます。

#define MAX 100
  • 1

論理的なルールとしては、次のコードに出現する場合、この操作ステップは前処理段階で完了します。通常、#define を使用して定数を定義する場合、名前は大文字で記述されます。

使用するシーン:
ここに画像の説明を挿入します

3. #define はマクロを定義します

#define は関数と同じ方法でマクロを定義するために使用されますが、置換する場合、期待する結果が得られない可能性がある演算子の優先順位の問題を避けるために、変数を括弧で囲む必要があります。
使い方:

#define MAX(x,y) ((x) > (y) ? (x) : (y))
  • 1

これは、2 つの数値の直接大きい値の判定を完了するために作成されたマクロです。マクロ名の後の括弧はマクロの近くにある必要があります。

使用事例:
ここに画像の説明を挿入します
ここに画像の説明を挿入します

上記の 2 つのケースを通じて、関数が渡される場合、マクロは型を制限せず、関数の戻り値の型が固定され、マクロの実行が高速になることがわかります。

4. マクロ更新機能の比較

マクロの利点:

  • 1. 少ないコード量で計算を完了する場合、マクロの作業時間は関数の作業時間よりも短くなります。
  • 2. さらに重要なのは、関数のパラメータは特定の型で宣言する必要があるということです。マクロは、> を使用して比較できるさまざまなタイプに適用できます。マクロの種類は関係ありません。

マクロの欠点:

    1. マクロが使用されるたびに、マクロ定義コードのコピーがプログラムに挿入されます。マクロが比較的短い場合を除き、プログラムの長さが大幅に長くなる可能性があります。
    1. マクロはデバッグできません。
    1. マクロは型に依存しないため、厳密さが十分ではありません。
    1. マクロは演算子の優先順位の問題を引き起こす可能性があり、プログラムでエラーが発生しやすくなります。

マクロと関数の比較表:

属性#define 定義済みマクロ関数
コード長マクロは使用されるたびにプログラムに挿入されます。非常に小さなマクロを除いて、プログラムの長さは大幅に増加します。関数コードは 1 か所にのみ出現し、使用されるたびにその場所にある同じコードが呼び出されます。
実行速度もっと早く関数の呼び出しと戻りのオーバーヘッドが追加され、速度が低下します。
演算子の優先順位マクロ パラメーターは、括弧が含まれていない限り、周囲のすべての式のコンテキストで評価されます。隣接する演算子の優先順位によって予期せぬ結果が生じる可能性があるため、マクロをより多くの括弧で記述することをお勧めします。関数パラメータは、関数が呼び出されたときにのみ評価され、関数に渡されます。式は予測どおりに評価されます。
副作用のあるパラメータパラメータはマクロ本体内の複数の場所に置換される可能性があり、マクロのパラメータが複数回評価される場合、副作用のあるパラメータ評価により予期しない結果が生じる可能性があります。関数のパラメーターはパラメーターを渡すときにのみ評価され、制御が簡単です。
パラメータの種類マクロのパラメータは、パラメータの操作が正当である限り、どのタイプのパラメータでも使用できます。関数のパラメータは型に関連しています。異なる場合は、異なる関数が必要になり、タスクも異なります。
デバッグマクロはデバッグに不便です関数はステートメントごとにデバッグ可能
再帰マクロは再帰的にはできませんマクロは再帰的にはできません

5. # と ##

1.#演算子

#operator は、マクロの引数を文字列リテラルに変換します。パラメータを持つマクロの置換リストにのみ使用できます。
# 演算子によって実行される操作は、「文字列化」として理解できます。

使用例:
ここに画像の説明を挿入します

2. ## 演算子

## は、その両側のシンボルを 1 つのシンボルに結合できるため、マクロ定義で別々のテキスト セグメントから識別子を作成できます。マーカー用の接着剤
このような接続では、有効な識別子を生成する必要があります。それ以外の場合、結果は未定義です。ここで考えてみましょう。2 つの数値のうち大きい方の値を求める関数を作成する場合、データ型ごとに異なる関数を作成する必要があります。

使用例:
ここに画像の説明を挿入します