c语言里的宏(翻译)3
原文在这里
function-like 宏
除了定义一个宏当变量使用,你也可以定义一个宏当函数用,这种宏就叫function-like宏。定义function-like宏同样用#define语句,不同的是还要宏名字后面跟一对括号,比如:
#define lang_init() c_init() lang_init() ==> c_init()
只有在宏名字后面紧跟着一对括号的时候,function-like宏才会被展开,如果没有括号,就不会被展开。这种特性在某些场合很有用,比如你有一个函数和一个宏,它们的名字相同,而你有时候想用函数有时候想用宏,
extern void foo(void); #define foo() /* optimized inline version */ ... foo(); funcptr = foo;
这里foo()会使用宏,而funcptr=foo中的foo指代foo函数的指针。
如果在宏名字和括号之间加入空格,那么这个宏不是function-like宏,而是object-like宏,该宏展开后开头的字符串是那对括号
#define lang_init () c_init() lang_init() ==> () c_init()()
开头的那对括号是宏展开生成的,最末的那对括号是lang_init宏之后的符号,没法预处理就留着不动。