如何编写安全和用户友好的c/c++ #define宏

How to write safe and user friendly c/c++ #define macros

本文关键字:c++ #define 安全 何编写 用户      更新时间:2023-10-16

我一直在思考如何编写安全、可读和直观的宏。正确使用它们应该通过它们的外观来理解,当使用不正确时,编译器应该告诉你,而不是让你引入一个模糊的错误。

在编写多行定义宏时,我通常发现自己是这样构造它们来满足所需的条件的:

#define macro(x)    do{                      
                        ... some code line ; 
                        ... some code line ; 
                    }while(0)

这样你就可以…

if (a)
{
    macro(a);
}

if (a)
    macro(a);
else
{
    ...
}

一个很好的特性是,如果你不正确地使用它们,你会得到一个编译器错误。这将无法编译,例如:

if (a)
    macro(a)
else
    b();

然而,我见过一些软件开发人员读到这种宏结构,并对它感到相当困惑。您能想到其他方法来编写宏吗?这些宏不会欺骗用户,因为它们会做一些与预期不同的事情,并且在浏览新代码时仍然是可以理解的。

另外,你能发现任何问题与do {} while(0)方法?例如,它可能是一种情况,您希望宏以某种方式运行,但事实并非如此。

我不完全相信do {} while(0)方法是一种好方法的原因是宏本身看起来有点奇怪,需要向以前没有见过这种结构的人(至少有些人)解释一下。

编辑:

下面是我喜欢的评论链接中的一个例子(谢谢!)我觉得这很好读:

#define MYMACRO(a,b)   
    if (xyzzy) asdf(); 
    else (void)0

有可能打破它吗?

当您希望宏什么都不做,并与预处理器切换此行为时,常用的方法是使用void(0)操作。

#if SOMETHINGS
#define macro(x)    do{                      
                        ... some code line ; 
                        ... some code line ; 
                    }while(0)
#else
#define macro(x) ((void)(0))
#endif

这样在清空宏操作

时就不会中断编译