この形式のマクロの最も一般的なケースの1つ:
#define _M(x) x
これは、現在普及しているANSI C方言よりも前のCの元のK&R方言のみをサポートするコンパイラに下位互換性を提供することです。言語の元のK&R方言では、関数を宣言するときに関数の引数が指定されていませんでした。1989年、ANSIは言語を標準化し、引数のタイプの数を宣言する関数プロトタイプを含む多くの改良を取り入れました。
int f(int x, double y); /* ANSI C. K&R compilers would not accept this */
int f(); /* Function declared in the original K&R dialect */
Cの元のK&R方言をサポートするコンパイラは最近ではまれ(または消滅)ですが、両方の種類のコンパイラをサポートする必要があるときに多くのソフトウェアが作成され、マクロは両方をサポートする簡単な方法を提供しました。この下位互換性を提供するヘッダーはまだたくさんあります。
K&Rコンパイラに下位互換性を提供するために、多くのヘッダーファイルには次のものがあります。
#if ANSI_PROTOTYPES
# define _P(x) x
#else
# define _P(x) ()
#endif
...
int f _P((int x, double y));
定義が正しく設定されている場合ANSI_PROTOTYPES
(ユーザーまたは以前のロジックのいずれかによって#ifdef
)、目的の動作が得られます。
- ANSI_PROTOTYPESが定義されている場合、定義はに展開され
int f(int x, double y)
ます。
- ANSI_PROTOTYPESが定義されていない場合、定義は次のように展開されます。
int f()