私はこれにCコードが与えられており、見出しステートメントには次のものが含まれています。
#define, EQ(a, b) ((a) == (b))
どういう意味ですか?
私はこれにCコードが与えられており、見出しステートメントには次のものが含まれています。
#define, EQ(a, b) ((a) == (b))
どういう意味ですか?
それは何の意味もありません。このコードは形式が正しくありません。の直後のトークン#define
は識別子である必要がありますが、そうで,
はありません。
,
が削除された場合、これは2つの引数を取るという名前の関数のようなマクロを定義します。EQ
カンマは、コードのコンパイルを妨げるエラーです。タイプミスだと思います。
与えられた:
#define EQ(a, b) ((a) == (b))
これは、等式演算子のマクロを定義します==
。
コードの後半でこのマクロを使用すると、次のように入力できます。
if (EQ(2+2, 4))
それ以外の:
if (2+2 == 4)
あまり役に立たない、本当に。
一歩一歩進んでいきましょう
#define MAX 10
これにより、コード ファイル内の単語 "MAX" のすべてのインスタンスが 10 に置き換えられます。これは定数変数を定義するのとよく似ていますが、大きな違いが 1 つあります。#define ステートメントの解釈は、コンパイルの前に行われます。これは、MAX を配列サイズとして使用する例に役立ちます。代わりに変数を使用した場合、多くの場合、コンパイラ エラーが発生します。
Linux ターミナルでコマンドを使用cpp <filename.c>
して、マクロが実行されたときに何が起こるかを確認できます。
例として、このコード:
#define MAX 10
int numbers[MAX];
前処理後 (つまり、プリプロセッサ マクロの解釈)
int numbers[10];
#define ステートメントは、解釈されると消えてしまうことに注意してください。
これにより、別の例が表示されます
#define square(x) (x * x)
square(x)
コード内の のすべてのインスタンスがに置き換えられるだけでなく(x * x)
、x の値も置き換えられます。これは関数の減速に似た効果がありますが、やはり異なります
それで
square(5)
に置き換えられます(5 * 5)
最後に私たちの例
#define, EQ(a, b) ((a) == (b))
これにより、のすべてのインスタンスが置き換えEQ(a, b)
られます((a) == (b))
例として
EQ(4, 5)
に置き換えられます((4) == (5))
「==」とはどういう意味ですか? 4 と 5 が等しい場合は「等しいかどうかのチェック」です。式全体が 1 として評価されます (これは明らかに真ではありません)。したがって、この式は最終的に 0 として評価されます。
多かれ少なかれこの機能の効果が好きです
int EQ(int a, int b)
{
return (a == b);
}
次のように書くこともできます
int EQ(int a, int b)
{
if (a ==b) return 1;
if (a !=b) return 0;
}
マクロを使用すると、2 つの変数宣言が回避され、実際には関数呼び出しがなく、一般に高速であることに注意してください。低速のプロセッサー (またはマイクロプロセッサー) を使用している場合、この利点は明らかです。
最後に、明らかなことを述べさせてください
#define simple_macro 5
int some_integer_variable = 10;
.
.
.
some_integer_variable = simple_macro;
simple_macro = 12; /* illegal statement */
simple_macro++; /* illegal statement */
プリプロセッサを実行した後、これは
int some_integer_variable = 10;
.
.
.
some_integer_variable = 5;
5 = 12;
5 ++;
おー!話しすぎたかもしれませんが、この(明らかな)コードを残しましょう
#define MAX 10
int variable = MAX; /*this is a MAX variable */
char some_string[] = "the MAX value"; /* no replacement will happen here */
int variable_MAX; /* no replacement will happen here */
プリプロセッサを実行すると、
int variable = 10;
char some_string[] = "the MAX value";
int variable_MAX;