重複の可能性:
インライン関数とプリプロセッサ マクロ
インライン関数は、C スタイル マクロ (#define macroname...) を置き換えるために C++ に導入されましたが、インライン関数ではなく古い C スタイル マクロを使用する C++ コードが多く見られますが、インライン関数は古い C スタイル マクロよりも劣っていますか?
重複の可能性:
インライン関数とプリプロセッサ マクロ
インライン関数は、C スタイル マクロ (#define macroname...) を置き換えるために C++ に導入されましたが、インライン関数ではなく古い C スタイル マクロを使用する C++ コードが多く見られますが、インライン関数は古い C スタイル マクロよりも劣っていますか?
マクロはインライン関数より劣っていると思います。
インライン関数はタイプ セーフですが、マクロはそうではありません。それが彼らの大きな利点です。コンパイラは、より良いコードを作成するのに役立ちます。
そうは言っても、マクロにはできて関数にはできないことがいくつかあります。こういったものは少ないですが…。
C プログラマーはマクロに慣れて、その習慣を C++ に続けていると思います。
彼らが劣っているとは言いません。C++ では、インライン関数またはテンプレートで同じ効果を得ることができないマクロでできることはあまりありません。私が思いつくのは、'#' 文字列化マクロ演算子だけです。Boost にそれを行う方法があったとしても、私は驚かないでしょう。
ただし、定数に関して言えば、マクロには 1 つの利点があります。通常、マクロはデータ領域を占有せず、命令ストリームに直接書き込まれます。メモリ フットプリントが小さいシステムでは、これは重要な考慮事項になる可能性があります。
まだマクロを使用していると想像できる唯一のことの 1 つは、LINEおよびFILEマクロをロギング ステートメントに組み込むことです。
例えば:
#DEFINE TRACE(S) vGenericLogStatement(__FILE__,__LINE__, s)
vGenericLogStatement の定義は次のようなものでした。
void vGenericLogStatement(char* fileName, int line, char* traceMesg);
それらはまた、迅速で汚れた文字列連結にも役立ちます。