optimizing_cpp(12)
十二、元编程
元编程:普通编程操纵数据,元编程操纵其他编程语言,元编程指生成其他程序的程序。
在讲元编程前,必须补充模板编程的知识,在讲模板编程前,我想先补充一下宏编程的基础知识,因为两者有许多相似之处(我太菜了,不会的太多了)
1.宏编程与预处理
宏编程继承自c语言,在预处理时被替换。
预处理过程的第一步是进行一些翻译处理,包括讲源码中出现的字符映射到源字符集,会同时处理多字节序列和三字符序列(三字符序列的介绍三字符序列 - 逛博 - 博客园 (cnblogs.com))
接着把物理行转换为逻辑行,示例如下:
然后,编译器讲文本划分为预处理记号序列、空白序列和注释序列,使用一个空格替换注释序列,使用一个空格替换所有的空白字符序列。
最后进入预处理阶段,预处理器查找一行中以#开头的预处理指令。
1.1#define
define作用是定义常量,在预处理阶段将代码中的宏替换为替换体。
需要注意的是如果宏中还包含宏,会再次替换,字符串内的不会被替换。
宏分两种,类对象宏:宏代表值,类函数宏:宏代表函数
如果要在宏函数的字符串中包含宏参数怎么办?
在字符串内使用#运算符:
如果要在宏函数中实现记号组合怎么办?
使用##运算符粘合两个记号
1.2#undef
取消已定义的#define指令
1.3#ifdef #else #endif
这几个主要用于条件编译
#ifdef指如果已经用define定义过了就执行下面的指令,如果没有就执行#else里的指令,直到#endif
1.4#ifndef
ifndef与ifdef有些类似,只不过是如果未定义就执行下面的指令,主要用于防止相同的宏被重复定义
1.5#if #elif #else
与逻辑语句中的if else类似
另外,还可以用#if defined(VAX)
代替 #ifdef VAX
1.6预定义宏
c语言中还规定了一些预定义宏:
1.7#line #error
1.8#pragma
pragma将编译器指令放入源代码中
2.元编程
c++的元编程基于模板编程,对模板编程不熟悉的可以看下这个链接,里面不光详细的介绍了模板编程的语法,还系统的介绍了元编程