这种形式的宏最常见的情况之一:
#define _M(x) x
是为仅支持 C 的原始 K&R 方言的编译器提供向后兼容性,该方言早于现在无处不在的 ANSI C 方言。在该语言的原始 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()