宏定义的使用

本文详细介绍了宏定义在C/C++编程中的好处,包括提高代码可读性、便利性,以及如何使用#和##进行参数处理、注意事项,如正确使用括号和换行规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

使用宏定义的好处:

1. 不带参数的宏定义 

2.带参数的宏定义

2.1. 使用# 

2.2. 使用##

3. 宏定义注意事项 

1) 宏定义只是简单的替换而已 (#,##下也是相应的替换)

2)在用于计算时一定要注意先后顺序(建议加上括号) 

3) 如果宏定义比较长的话,可以使用\换行 。


 

使用宏定义的好处:

1. 代码的可读性更高。

2. 更加方便代码修改。

1. 不带参数的宏定义 

#define NUB 20
#define STR "好好学习"

宏定义使用#define 预处理指令定义, 上面就是定义了两个宏。 

定义之后,代码在预处理阶段会将宏展开(就是简单的替换) 

int a  =  NUB; // 宏展开之后代码为 int a = 20;

printf("%s",STR); // 宏展开之后代码为, printf("%s","好好学习");

2.带参数的宏定义

#define x(i) i*i;

int a = x(2); // 宏展开之后,为int a = 2*2;

上图,就是使用了带参数的宏,其实使用时和函数带哦用类似,但是宏只是简单的替换,所以比函数要快的多。 

2.1. 使用# 

#define A(i) #i

printf("%s",A(好好学习)); // 宏展开之后-- printf("%s","好好学习");

#就是在宏展开(就是简单的替换的时候),给参数加上一个双引号。(如上图) 

2.2. 使用##

#define A(i) i##1;
#define A1(I) i##"学习"

int A(x) = 10; // 宏展开之后,int x1 = 10;

printf("%s",A1(”好好“)); // 宏展开之后, printf("%s","好好学习");

##就是在宏展开的时候,将参数和1链接起来,将两个字符串拼接了起来。

3. 宏定义注意事项 

1) 宏定义只是简单的替换而已 (#,##下也是相应的替换)

#define M(X)  #X
#define M1(x) x##"1"
#define M2(x) x##1

using namespace std;

int main(void)
{

	printf("%s", M1(x));  // 宏替换之后, printf("%s",x"1");

    printf("%s",M2(x)); // 宏替换后,printf("%s",x1);

	system("pause");

	return 0;
}

看上面代码,它只是进行了简单的替换,所以应该注意使用场景,比如第二个,我们输出字符串(可是它替换下来,不带"",只是一个变量名称,所以可以定义变量时这么用)  int M2(x) = 1; 宏展开后为int  x2 = 1; // 定义了一个x2的变量

2)在用于计算时一定要注意先后顺序(建议加上括号) 

情况一: 

#define M(i) i+i

int a = M(1)*2; // 宏替换之后. int a = 1+1*2; = 3


// 改进

#define M(i) (i+i)

int a = M(1)*2; // 宏替换之后. int a = (1+1)*2; = 4

看上面代码,我们本来想计算(1+1)*2,但是,由于宏是简单的替换,只是将1+1换下来了,换下来计算的顺序就变了,结果变为了3。可以根据,上面代码改进。   

情况二: 

#define M(i) i*5

int a = M(1+1); // 宏替换之后. int a = 1+1*5; = 6


// 改进

#define M(i) (i)*5

int a = M(1+1); // 宏替换之后. int a = (1+1)*5; = 10

上面代码类似,也是加括号 

所以建议:  都加括号

#define M(i) ((i)*(i))

3) 如果宏定义比较长的话,可以使用\换行 。

// 换行顶格写(建议顶格写)

#define a "好好\
学习"   // 可以换行,这里需要顶格写

printf("%s",a);  // 输出 好好学习



// 换行不顶格写

#define a "好好\
          学习"   // 可以换行,这里没有顶格写(编译器可能标红线,但是你可以忽略,仍然可以通过编译)


// 这样输出,会将前面的空格也会输出

printf("%s",a);  // 输出 好好         学习

建议顶格写,因为不顶格写会导致输出中间的空格。(其实和输出时换行一个原理). 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值