我一直在思考如何编写安全、可读和直观的宏。正确使用它们应该通过它们的外观来理解,如果使用不当,编译器应该告诉你,而不是让你引入一个模糊的错误。
在编写多行定义宏时,我通常会发现自己是这样构造它们以满足所需条件的:
#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();
但是,我看到 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
这样你就不会在取消宏操作时中断编译
关于c++ - 如何编写安全且用户友好的 c/c++ #define 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23444371/