如何编写安全和用户友好的c/c++ #define宏
How to write safe and user friendly c/c++ #define macros
我一直在思考如何编写安全、可读和直观的宏。正确使用它们应该通过它们的外观来理解,当使用不正确时,编译器应该告诉你,而不是让你引入一个模糊的错误。
在编写多行定义宏时,我通常发现自己是这样构造它们来满足所需的条件的:
#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
这样在清空宏操作
相关文章:
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 如何以静态代码分析友好的方式使用 #define 防护?
- C++相当于整数的 #define
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 找不到 #define 的函数定义
- "#define X X"是什么意思?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- c中 #define 的不足
- 使用 [#define & #ifdef] 跨文件激活代码块
- 如何避免#define语法的变量重新声明
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 使用 #define 声明函数
- #define 宏中的括号失败
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor