C语言宏的空格


还记得曾经的日子走过的风风雨雨,还记得过去的岁月里度过的艰难险阻。

如今,在昨天某改写的一歌词中,提到的17位朋友(QZR、FMQ、上火、lzycc、6f、隔夜、NULL、void、橘光鸟、刀片、导弹、居正、关门、四叶草、DYT、MFC、YY,以上排名一律使用这些朋友自行认可的私下的网名,以避免同行因利益进行恶意诋毁,且排名不分先后),以及他们的故事,让上火回忆起了曾经一同走过的风云岁月。

他们中有3D开发的大佬,有NOIP比赛的大神,有网站建设中的技术大牛,还有人工智能和大数据及网络安全等不同领域的大咖级人物,他们(除上火)都还很年少,他们是未来的领航者。


感慨完毕,那改编的词已放在本上火的网站,随时可能删除。下面进入今天的正文:关于预处理的宏中的一些问题。这篇内容虽然涉及了预处理,但其实这篇讲到的内容很短,也比较的简单。


因为一些朋友刚接触C,一遇上了用预处理的define来定义一些东西,离学习预处理还有很漫长的一段距离,就兴冲冲的去“研究”一番,然后写出各种有歧义的代码。实际上,大家按顺序来学习,一般是不会出现这样的情况的。

首先,这里宏并不是函数,也不同于语句,更没类型定义,这些以后都会谈到。但是这些都是以后比较复杂的内容,今天这里说到的主要是一些:兴冲冲的去“研究”一番的,新人容易遇到的宏定义的空格问题


在下面这行有歧义的代码中,大家想想这个fun代表了什么:

#define fun (i) ((i)-1)

这里为了避免大家看不清这里的空格,特意注明一下,上面代码中空格分布是这样的:

​#define fun (i) ((i)-1)

在这里,fun是表示fun(i)代表((i)-1),还是表示fun代表(i) ((i)-1)呢?

其实这里的预处理宏定义表示的是“fun代表(i) ((i)-1)”这种情况。


一个函数不带参数,调用时只要在函数名后面加上一对括号即可调用。

一个宏不带参数,只需要宏名,而括号的存在就有些多余了。

预处理器需要从宏定义中,来确定宏调用是否需要参数等,而在宏定义中,如果不关注空格的问题,那么就可能造成上文的有歧义的结果。

因为这是定义中的问题,调用时没有这问题,因此上述完成宏定义后,fun(10)与fun (10)的结果都为9。


本文讲到C语言预处理中宏定义中空格的歧义情况,如有疑问欢迎加入Q群564998567与我们交流,如有错误恳请在反馈平台www.snang.cc/bgst/3/指出。如果您方便的情况下,请在微信里关注一下上火者公众号吧!。