元数据
元即不可变,元数据包括整数和字符串两种基本数据。
其中,字符串是使用单引号或者双引号包围的字符序列。
此外,另一类元数据是标记,预处理元编程主要运算标记,最终将标记展开为指定形式的文本。
预处理程序只能识别整数和字符串,但对标记内容没有限制,可以是任意字符序列文本。
基本语法
# // 空预处理指令,相当于空行
引入任何文本文件
#include <iostream>
定义标记,用来声明元数据和元函数
#define _WIN32
由于所有标记是全局可见,为避免名字冲突,在用完标记后及时删除
#undef DEFINE // 删除标记
分支语句,只能识别整数表达式和defined表达式
#if QSS_STYLE
#elif QSTYLE
#else
#endif
检查标记是否已经定义
#ifdef __cplusplus
#endif
以上相当于如下预处理指令
#if defined(__cplusplus)
#endif
检查标记是否未定义
#ifndef __cplusplus
#endif
以上相当于如下预处理指令
#if !defined(__cplusplus)
#endif
产生一条错误消息,停止预处理
#error message
特殊符号
虽然在预处理元编程标记可以使用任意字符,但逗号和左右圆括号对于元函数有特殊含义,逗号被用于分隔函数参数,而圆括号则标记函数参数列表。
特殊操作符
定义元函数,字符串化content
#define string(content) #content
定义元函数,拼接front和back
#define splice(front, back) front##back
C++11/14可变参数宏特性
// 定义可变参数元函数
#define vfunc(statement, ...) statement{ __VA_ARGS__ }
调用元函数,展开参数列表,结果为vector v{ 7, 9, 10 };
vfunc(vector v, 7, 9, 10);
自定义用法
提示用户使用C++编译器
#ifndef __cplusplus
#error The file requires a C++ compiler.
#endif // !__cplusplus
定义命名空间起始和终止宏
#define ETERFREE_BEGIN namespace eterfree {
#define ETERFREE_END }
定义utf-8编码宏
#if _MSC_VER >= 1900
#define u8(string) u8##string
//#elif _MSC_VER >= 1800
//#define u8(string) QStringLiteral(string)
#else
#error The macro definition requires a C++ compiler of version 1900 and above.
#endif
参考资料
[1] C++11/14高级编程——Boost程序库探秘(第3版)/罗剑锋著. 北京:清华大学出版社,2016 (ISBN 978-7-302-44175-5)