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

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

在编写多行定义宏时,我通常会发现自己像这样构造它们以满足所需的标准:

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

这样你就可以……

 if (a) { macro(a); } 

和…

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

这个的一个很好的function是,如果你错误地使用它们,你将收到编译器错误。 这不会编译例如:

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

但是,我看到SW开发人员阅读了这种宏构造,并对它感到非常困惑。 您是否可以考虑使用其他方法编写宏,这些宏不会以某种方式欺骗用户,而是在他们执行非预期的操作时,并且在浏览新代码时仍然可以理解?

另外,你能找到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 

这样,无论何时归零宏操作,都不会破坏编译