C语言宏定义几个问题

1.#define Ant A虽说做的是将代码中Ant替换成A,但是是整体的替换,不能将整体分离替换。
不带宏参定义一般形式如下:
格式: #define 标识符 字符串
其中“标识符”为所定义的宏名,“字符串”可以是常数、表达式、格式串,也可以无值。

比如:
若有Ant>B这个表达式,Ant作为一个局部整体,B也作为一个局部整体,所以Ant会被替换成A,即A>B;若有Anta>B这个表达式,Anta作为一个局部整体,B也作为一个局部整体,虽说Anta中含有Ant,但他为一个整体,不会分开替换成Aa>B。
若要取消宏,则#undef Ant

又比如:
若有 "Ant is animal."这个字符串,"Ant is animal."作为一个整体,所以字符串中的Ant不会被替换成A。

2.带参数define(宏函数)
带宏参定义一般形式如下:
格式:#define 标识符(形参列表) 字符串
其中字符串中含有各个形参

若有#define mul(a,b,c,d) a*b*c*d
括号中即有a,b,c,d四个形参
假设mul(1,2,3,4)即会替换成1*2*3*4
表达式得出来的结果为24
但是我们一般引用形参时候都会带括号,即 (a)(b)(c)(d)
为什么呢?
这是为了防止逻辑错误,#define只是替换,并不知道你的逻辑,替换后的语句可能因运算符优先级导致逻辑错误。
假设mul(1+1,2,3,4)
得出来的表达式为1+1*2*3*4,这样就等于25,但实际上我想要的是1+1=2然后再2*2*3*4=48。

注意:宏名和形参之间不能有空格出现,不然预处理器会将mul替换成(a,b,c,d) a*b*c*d。

3.带#(字符串化符)的define
(1)若有#define str(a) #a
则str(good)即被替换成字符串"good"
但#只限用于参数前才会将参数转换成字符串
(2)若有#define A #a
他不会把A替换成"a",而是把A替换成#a

4.带##(片段连接符)的define
若有#define link(num) num##778
则参数num会与778连在一起,即##起连接num和778成为一个整体的作用,
如str(123)会被替换成123778这个整体

注意:在带#或带##的define宏定义执行中不会被其他宏定义给替换掉
如:
#define STR1 “aa”
#define STR2 “bb”
#define STR1STR2 “welcome”
#define CAT(STR1,STR2) STR1##STR2
int main()
{
printf(“%s\n” ,CAT(STR1,STR2));
return 0;
}
得到的输出结果为:welcome
因为CAT(STR1,STR2)中含##,所以执行替换中不会被#define STR1 "aa"与#define STR2 “bb"影响,在执行完替换后,即STR1STR2,其为一整体,更不会被"aa"和“bb”替换,只会将整体的STR1STR2给替换成"welcome”。

不带#且##的define宏定义宏参数中若包含其他宏,那么宏参数在被代入之前会被其他宏替换掉。
又如:
#define A(y) X_##y
#define B(y) A(y)
#define SIZE 1024
#define S SIZE

问:A(S)、B(S)分别会被替换成什么?

结果:A(S)会被X_S替换,B(S)会被X_1024替换。
分析:
A(S)宏定义中含##,故替换过程中不会被其他宏定义替换,即不会被#define S SIZE替换,所以替换成了X_S,而X_S这个整体没有关于他的宏定义,所以结果为A(S)会被X_S替换;
B(S)宏定义中不含##,B(S)故会被替换成B(Size),后被替换成B(1024),最后结果就为X_1024。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值