Cでプリプロセッサマクロを作成することは一般的に推奨または推奨されていませんか?これにより、同じシグネチャ(名前のみが異なる)を持つ多くの関数の作成が容易になります。たとえば、代わりに:
obj *car(const obj *args, obj **envp, GarbageCollector *gc) { ... }
obj *cdr(const obj *args, obj **envp, GarbageCollector *gc) { ... }
obj *cons(const obj *args, obj **envp, GarbageCollector *gc) { ... }
...
あなたができる:
#define DEF_PRIMITIVE(name) obj *name(const obj *args, obj **envp, GarbageCollector *gc)
DEF_PRIMITIVE(car) { ... }
DEF_PRIMITIVE(cdr) { ... }
DEF_PRIMITIVE(cons) { ... }
...
コードの面倒な繰り返しを減らすことがポイントです。これが良いアイデアかどうかについては、どちらの側にもいくつかの議論があります。
これを行う理由
これを行わない理由
マクロの使用方法は、プログラマーがマクロについて推論することを非常に困難にし、マクロの結果がどうなるかを推測します。最も基本的な例以外では、マクロは通常、エッジのケースとデバッグが非常に困難な問題につながります。
歴史的に、マクロは最適化の目的で有用でした。関数への1回の呼び出しが少ないCPUサイクルを節約することを意味しましたが、これは大きな問題になります。
今日では、関数呼び出しがコードのボトルネックになる場合はほとんどありません。特に 「インライン関数はマクロと同じくらい高速です。」
したがって、いいえ、読みやすさ、メンテナンス、および頭痛の軽減のために、関数の代わりにマクロを使用することは想定されていません。関数には型チェックの利点があり、コードとコンパイラオプションを適宜調整すると、マクロと同じパフォーマンスが得られます。