gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:34 26 4
gpt4 key购买 nike

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com