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

标签 c++ c c-preprocessor

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

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

#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/

相关文章:

c++ - C++ 中变量的位表示

c++ - #include <filename> 和 #include "filename"有什么区别?

c - #define的替换和字符串化

为包含指针引用的已分配内存的结构释放内存的正确方法

c++ - 如何提高轮廓精度?

c - 从函数导出列表

c-preprocessor - C/C++ 预处理器 #include 语法。强制使用空格?

c++ - 为什么不认为类在静态数据成员初始值设定项中已完全定义?

c++ - 在 cmake3 上指定临时构建文件路径

c++ - 找不到标识符 FindFirstFile