预处理元编程

元数据

元即不可变,元数据包括整数字符串两种基本数据。
其中,字符串是使用单引号或者双引号包围的字符序列。
此外,另一类元数据是标记,预处理元编程主要运算标记,最终将标记展开为指定形式的文本。
预处理程序只能识别整数和字符串,但对标记内容没有限制,可以是任意字符序列文本。

基本语法

#	// 空预处理指令,相当于空行

引入任何文本文件

#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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值