最近在看JavaScript引擎“SpiderMonkey”的源代码,其中用#define 定义了许多复杂的宏,因此打算先总结一下#define的用法,然后再继续看其源代码。
1. 定义常数
eg. #define P 3.1415926
2. 定义函数
eg. #define MAX(x, y) ((x) > (y)) ? (x) : (y)
* 注意:在定义的时候所有的层次都要加括号,以免在替换的时候出现问题。
3. 定义单行宏或定义多行宏
eg. #define JS_KEYWORD(keyword, type, op, version) /
const char js_##keyword##_str[] = #keyword;
#include "jskeyword.tbl"
#undef JS_KEYWORD
1) 前加##或后加##,将标记作为一个合法的标识符的一部分.注意,不是字符串.多用于多行的宏定义中.例如上面的js_##keyword##_str[].
2) 前加#@,将标记转换为相应的字符,注意:仅对单一标记转换有效
3) 前加#,将标记转换为字符串.例如#keyword.
* 注意:在定义多行宏时,除了最后一行其它行的结尾都要加斜杠"/".
5. 条件编译
eg. #ifdef DEBUG
extern JS_PUBLIC_API(void)
JS_Assert(const char *s, const char *file, JSIntn ln);
#define JS_ASSERT(_expr) /
((_expr)?((void)0):JS_Assert(# _expr,__FILE__,__LINE__))
#define JS_NOT_REACHED(_reasonStr) /
JS_Assert(_reasonStr,__FILE__,__LINE__)
#else
#define JS_ASSERT(expr) ((void) 0)
#define JS_NOT_REACHED(reasonStr)
#endif