C/C++之宏定义

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)

注意:简单的代码替换,不是传参。

本节我们介绍了宏定义,下节我们介绍结构体。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值