简述
宏作为C/C++最有特色的语言性质之一,犹如魔法一般,合理的使用可以极大的提高开发效率。
宏(Macro) 是C/C++的一个预处理指令,本质上是编译开始前进行的简单文本替换,我们可以定义一组宏代码片段,在程序中多次使用, 从而减少开发时间和精力。甚至我们可以使用宏来实现一些奇怪的操作,例如在C语言中利用宏做到如同模版一样的泛型编程。
宏的简单使用
基础语法
宏的基础使用方式如下:
#define 标识符 替换列表
比如,我们可以定义一个简单的宏PII,将其替换为浮点型字面量3.14
#define PII 3.14
// 我们可以在代码里使用PII这个宏
int main(){
std::cout << PII << std::endl; // PII 被展开为 3.14
return 0;
}
带参宏(宏函数)
我们同样可以定义一个宏函数,可以让我们像普通的函数一样来调用他,其写法和最普通的文本替换宏无太大区别,参数和函数一样用括号包裹,用逗号(,)分隔即可,如下我们编写一个宏实现乘法的功能。
#define mul(a, b) a*b
int main(){
std::cout << mul(2, 3) << std::endl; // mul(2, 3)展开为 2*3
return 0;
}
宏参字符串化#
有些时候,我们希望我们往宏传递的参数可以以字符串的形式展开,这个时候我们可以替换列表里使用#来将参数转为字符串。你可能觉得有些抽象,我保证看完下面这个例子,你就会知道什么是宏参字符串化:
#define str1(x) #x
#define str2(x) x
int main() {
const char* s1 = str1(hello); // 本行代码展开为 const char* s1 = "hello"
// const char* s2 = str2(hello); // 错误的代码,本行代码展开为 const char* s2 = hello
const char* s3 = str2("hello"); // 本行代码展开为 const char* s2 = "hello"
return 0;
}
宏拼接##
我们经常会有这样的需求,我们需要定义很多操作类似的函数,仅仅函数的前缀名不同,比如你可能需要在某处声明一系列这样的函数:
void func_1(int a, int b);
void func_2(