十二、元编程

元编程:普通编程操纵数据,元编程操纵其他编程语言,元编程指生成其他程序的程序。

在讲元编程前,必须补充模板编程的知识,在讲模板编程前,我想先补充一下宏编程的基础知识,因为两者有许多相似之处(我太菜了,不会的太多了)

1.宏编程与预处理

宏编程继承自c语言,在预处理时被替换。

预处理过程的第一步是进行一些翻译处理,包括讲源码中出现的字符映射到源字符集,会同时处理多字节序列和三字符序列(三字符序列的介绍三字符序列 - 逛博 - 博客园 (cnblogs.com)

接着把物理行转换为逻辑行,示例如下:

image-20220405184937602image-20220405184947815

然后,编译器讲文本划分为预处理记号序列、空白序列和注释序列,使用一个空格替换注释序列,使用一个空格替换所有的空白字符序列。

最后进入预处理阶段,预处理器查找一行中以#开头的预处理指令。

1.1#define

define作用是定义常量,在预处理阶段将代码中的宏替换为替换体。

image-20220405190044058

需要注意的是如果宏中还包含宏,会再次替换,字符串内的不会被替换。

宏分两种,类对象宏:宏代表值,类函数宏:宏代表函数

image-20220405190818123

如果要在宏函数的字符串中包含宏参数怎么办?

在字符串内使用#运算符:

image-20220405191449772

如果要在宏函数中实现记号组合怎么办?

使用##运算符粘合两个记号

image-20220405191603835

1.2#undef

取消已定义的#define指令

1.3#ifdef #else #endif

这几个主要用于条件编译

#ifdef指如果已经用define定义过了就执行下面的指令,如果没有就执行#else里的指令,直到#endif

image-20220405192830479

1.4#ifndef

ifndef与ifdef有些类似,只不过是如果未定义就执行下面的指令,主要用于防止相同的宏被重复定义

image-20220405193031000

1.5#if #elif #else

与逻辑语句中的if else类似

image-20220405193308657

另外,还可以用#if defined(VAX) 代替 #ifdef VAX

1.6预定义宏

c语言中还规定了一些预定义宏:

image-20220405193445791

1.7#line #error

image-20220405193856682

1.8#pragma

pragma将编译器指令放入源代码中

2.元编程

c++的元编程基于模板编程,对模板编程不熟悉的可以看下这个链接,里面不光详细的介绍了模板编程的语法,还系统的介绍了元编程

wuye9036/CppTemplateTutorial: 中文的C++ Template的教学指南。与知名书籍C++ Templates不同,该系列教程将C++ Templates作为一门图灵完备的语言来讲授,以求帮助读者对Meta-Programming融会贯通。(正在施工中) (github.com)