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宏之后的符号,没法预处理就留着不动。
posted @ 2008-10-17 15:15  gussing  阅读(512)  评论(0编辑  收藏  举报