3

代码宏的一点小知识

 3 years ago
source link: https://blog.csdn.net/tkokof1/article/details/118547099
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

代码宏的一点小知识

tkokof1 2021-07-07 15:06:30 12

本文是一篇关于宏定义的短文

C/C++ 中我们可以定义宏来做一些代码的简化工作,一般我们不推荐使用宏,因为使用过程中很容易出现问题,目前有一些方法可以用来取代宏的部分功能(譬如内联函数),但是仍然有些宏功能现在还没有更可靠方便的替代方法,遇到这些使用情境的话,我们还是需要使用宏.

宏的一个简单应用就是定义重复常量,譬如:

#define MAX_COUNT 1024

通过使用这种常量宏,我们可以较方便的维护代码中常量的变更.

我们也可以定义参数宏,能够起到"模拟"函数等作用:

#define MAX(a, b) ((a) > (b) ? (a) : (b))

上述宏定义了一个 MAX 宏,用以返回两个宏参数中较大的参数,这里需要注意一下,如果你使用带有副作用的宏参数,上面的 MAX 宏会返回意外的结果(因为宏并不是函数,宏本身只是做了代码的替换),譬如你这样使用 MAX 宏:

int a = 0;
int b = 1;
int max = MAX(++a, ++b);

得到的 max 结果是 3, 而不是预期中的 2.

我们也可以定义多行宏,方法就是在每一行的宏定义之后添加 \ 符号(最后一行不用添加 \ 符号):

#define MULTI_LINE_MACRO do {\
++i; \
} while(false);

使用多行宏可以非常大的简化一些格式化(包括重复)代码.

OK,简单寒暄了一点宏的知识,我们现在开始代码找茬:

#define MACRO_1 \
if (true) \
{ \
	return; \
}

#define MACRO_2 \
if (true) \
{ \
    return; \ 
}

上面代码中我定义了两个宏(MACRO_1 和 MACRO_2),代码上看两者似乎是一致的,但是执行编译的话, MACRO_2 却会在最后一行出现错误(MACRO_1 则没有编译错误):

语法错误:“}”

问题出在哪呢?有兴趣的朋友可以仔细找找(不必马上往下看结论)~


我一开始也觉得颇为奇怪,后来仔细查看之后才发现, MACRO_2 中的这一句定义:

return; \ 

\ 符号之后是有空格符的!这导致 MACRO_2 宏不能被编译器正确解析,遂尔造成了上面的编译报错…

看来又是一个宏使用中的陷阱(pitfall),在此简单一记~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK