宏定义的使用
2024-01-03 15:57:49
使用宏定义的好处:
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); // 输出 好好 学习
建议顶格写,因为不顶格写会导致输出中间的空格。(其实和输出时换行一个原理).?
?
?
?
?
?
?
?
?
?
?
?
文章来源:https://blog.csdn.net/weixin_68026222/article/details/135361432
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!