C/C++之宏定义
上节我们介绍了指针函数。C/C++指针作为函数的返回值
本节我们介绍宏定义。
-
如果我们在代码中使用了大量的相同常量,并且代码长度非常的可观,那么如果我们修改这些常量会怎么样?
是不是很麻烦,而且很容易出错。 -
此时我们引入宏定义
#define LENGTH 10
(经常使用)
#define 预处理指令
LENGTH 宏
10 替换体(多行可以用 \ 延续)例如:
#define a "abc\ def\ ghi"
注意: 变量的命名规则适用于宏
-
作用: 提高代码的可维护性和可读性,避免函数调用,提高程序效率。
-
例子:下面使用了非常多相同的常量,而且位置不同。
#include <iostream> using namespace std; //使用了大量的常量数字10 int main() { int a[10] = { 0 }; char b[10] = ""; float c[10] = { 0.0f }; for (int i = 0; i < 10; i++){ a[i] = i + 1; } for (int i = 0; i < 10; i++) { b[i] = 'a' + i; } for (int i = 0; i < 10; i++) { a[i] = i + 1; } return 0; }
如果想要把10修改成其他的数字比如14, 16等……是不是感觉很麻烦。
-
所以在写的时候尽量使用宏定义来代替常量。方便后面修改
修改:#include <iostream> using namespace std; //进行宏定义 #define LENGTH 10 //讲常量数字10修改成宏名length int main() { //相当于int a[10] = { 0 }; int a[LENGTH] = { 0 }; char b[LENGTH] = ""; float c[LENGTH] = { 0.0f }; for (int i = 0; i < LENGTH; i++){ a[i] = i + 1; } for (int i = 0; i < LENGTH; i++) { b[i] = 'a' + i; } for (int i = 0; i < LENGTH; i++) { a[i] = i + 1; } return 0; }
-
概念: 它是一种预处理指令,在预编译时将宏名替换为后面的常量。
也就是说,上面的例子中,在预编译阶段将LENTGTH
替换成了10
-
注意: 宏定义是简单的替换关系,替换体写的什么他就会替换成什么,所以不需要加分号;
-
几个错误示范:
第一个 使用"10"
字符串常量替换LENGTH
第二个 使用10;
替换LENGTH
#include <iostream> using namespace std; //进行宏定义 #define LENGTH 10 //此处直接将字符串"10"替换成LENGTH //#define LENGTH "10" //此处直接将字符串10;替换成LENGTH //#define LENGTH 10; //讲常量数字10修改成宏名length int main() { //相当于int a[10] = { 0 }; int a[LENGTH] = { 0 }; char b[LENGTH] = ""; float c[LENGTH] = { 0.0f }; for (int i = 0; i < LENGTH; i++){ a[i] = i + 1; } for (int i = 0; i < LENGTH; i++) { b[i] = 'a' + i; } for (int i = 0; i < LENGTH; i++) { a[i] = i + 1; } return 0; }
-
带参数的宏: 之前都介绍的都是不带参数的宏。
#include <iostream> using namespace std; #define add(x, y) x + y int main() { int a = 10, b = 14; int sum; sum = add(a, b); //相当于替换成 sum = a + b; cout << sum << endl; return 0; }
输出结果:
24
实际上没有传递参数进去,只是简单的替换关系。
-
注意: 简单替换的陷阱。
#include <iostream> using namespace std; #define square(x) x * x #define add(x, y) x + y int main() { int a = 10, b = 14; int sum; sum = square(add(a, b)); //相当于替换成 sum = a + b * a + b; cout << sum << endl; return 0; }
输出结果:
164
此处简单的替换就会导致运算顺序发生变化,导致得不到想要的结果(a + b) * (a + b)。
==修改也很简单,在替换体上加括号() ==
如:#define add(x, y) (x + y)
或者#define square(x) (x) * (x)
注意:简单的代码替换,不是传参。
本节我们介绍了宏定义,下节我们介绍结构体。