私はRustを学ぶ旅を始めています。Rust by Exampleでこの行に出くわしました:
ただし、C やその他の言語のマクロとは異なり、Rust マクロは、文字列の前処理ではなく抽象構文ツリーに展開されるため、予期しない優先順位のバグが発生することはありません。
抽象構文木が文字列の前処理よりも優れているのはなぜですか?
私はRustを学ぶ旅を始めています。Rust by Exampleでこの行に出くわしました:
ただし、C やその他の言語のマクロとは異なり、Rust マクロは、文字列の前処理ではなく抽象構文ツリーに展開されるため、予期しない優先順位のバグが発生することはありません。
抽象構文木が文字列の前処理よりも優れているのはなぜですか?
C プリプロセッサを使用した典型的な例は次のとおりです。
#define MUL(a, b) a * b
// ...
int res = MUL(x + y, 5);
マクロの使用は次のように拡張されます。
int res = x + y * 5;
これは予想とはかけ離れている
int res = (x + y) * 5;
これは、C プリプロセッサが実際には単純なテキストベースの置換を行うだけであり、実際には言語自体の不可欠な部分ではないために発生します。前処理と解析は、2 つの別個のステップです。
マクロが実際の言語構文の一部である言語で発生する、コンパイラの残りの部分のようにプリプロセッサが代わりにマクロを解析した場合、(前述のように) 優先順位や結合性などが考慮されるため、これはもはや問題ではありません。