#define 给……下定义
-
在C或C++语言源程序中
允许用一个标识符来表示一个字符串
,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换
,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的 -
因为宏展开、替换发生在预处理阶段,不涉及函数调用、参数传递、指针寻址,没有任何运行期的效率损失,所以对于一些调用频繁的代码片段,用宏封装的效果比使用 inline 要好,因为它是源码级别的无条件内联
-
“宏”分为有参数和无参数两种:
- #define ADD(x, y) ((x)+(y))
-
-
防止重复定义
-
C++ 预定义宏
- FILE 源文件名
- LINE 源文件行号
- DATE 预处理的日期
- has_include 是否存在某个可包含的文件
- cpp_modules 是否支持模块
- cpp_decltype 是否支持decltype
- _cpp_lib_make_unique 是否支持提供函数 make_unique()
#if defined(_cpp_decltype_auto)
#else
#if _has_include_(optionnal)
// #define 标识符(宏名) 字符串(常数、表达式、格式串)
//X*X这种写法如果传(5+4),就会出错== 5+4 * 5+4;避免这个问题可以:(X)*(X)
#define TESTFUNC(X) (X)*(X)
#define ngx_tolowper(c) ((c >= 'A' && c <= 'Z' ? (c | 0x20 : c)))
#define ngx_memzero(buf, n) (void) memset(buf, 0, n)
- 可以在宏定义前先检查,如果有定义,可以先取消再定义:
#ifdef AAA
#undef AAA
#endif
#define AAA 'xx'
- 通过宏实现命名空间替换
#define START_NAMESPACE_TEST(x) namespace x {
#define END_NAMESPACE_TEST(X) }