C中没有定义的宏

Gri*_*han 5 macros c-preprocessor

没有定义的宏功能有什么用途/适用性:

#ifndef __SYSCALL
#define __SYSCALL(a, b)
#endif
Run Code Online (Sandbox Code Playgroud)

可以在头文件中找到Linux系统中的这个宏 /usr/include/asm/msr.h

我也注意到以下类型的宏.

#define _M(x) x
Run Code Online (Sandbox Code Playgroud)

并且只有定义这种宏的理由才能使代码统一.比如#define SOMETHING(1 << 0).是否还有其他隐藏(更好)的使用这种宏?

一个例子的答案将非常有帮助.也有人可以给我一个文本/链接来阅读这个.

sfs*_*man 13

这种形式的宏的最常见情况之一:

#define _M(x) x
Run Code Online (Sandbox Code Playgroud)

是为那些只支持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 */
Run Code Online (Sandbox Code Playgroud)

虽然现在支持C的原始K&R方言的编译器很少(或已经灭绝),但是当需要支持这两种编译器时,编写了很多软件,并且宏提供了一种简单的方法来支持这两种编译器.还有很多标题可以提供这种向后兼容性.

为了向K&R编译器提供向后兼容性,许多头文件具有以下内容:

#if ANSI_PROTOTYPES
#  define _P(x) x
#else
#  define _P(x) ()
#endif

...

int f _P((int x, double y));
Run Code Online (Sandbox Code Playgroud)

如果ANSI_PROTOTYPES已正确设置定义(由用户或某些先前的#ifdef逻辑设置),那么您将获得所需的行为:

  • 如果定义了ANSI_PROTOTYPES,则定义将扩展为int f(int x, double y).
  • 如果未定义ANSI_PROTOTYPES,则定义将扩展为 int f()