#ifndef MACROS_NULLCHECK_H_
#define MACROS_NULLCHECK_H_
#include <assert.h>
#define NULLCHECK(x) assert(x != (void *) 0);
#endif
如果我使用上面的样式作为模板来声明宏,你会有什么附带条件?
答案 0 :(得分:14)
在参数周围加上括号(它可以防止传递表达式时出现问题)
不要放;最后(使用会更自然)
#define NULLCHECK(x)断言((x)!=(void *)0)
答案 1 :(得分:3)
我可能做出的一个改变是评论结束#endif
:
#endif // MACROS_NULLCHECK_H_
当文件比屏幕长时,可以更容易理解#endif
在那里做了什么。
答案 2 :(得分:3)
一般来说,您应该始终将宏参数放在扩展中的括号中,即在您的情况下
assert((x) != (void*) 0)
这是因为如果你不这样做,那么你传入的任何表达式(而不是简单的变量)都可能搞乱变量扩展。
我还建议您不要将分号放在宏定义的末尾,这样就必须将其称为
NULLCHECK(pSomething);
看起来更像C&amp;与其余代码一致。
答案 3 :(得分:1)
CERT C Secure Coding Wiki的一些优秀宏观做法:
PRE00-C。首选内联函数或静态函数,以实现类似函数的宏 PRE01-C。在参数名称周围的宏中使用括号 PRE02-C。宏替换列表应以括号括起来 PRE03-C。首选typedef来定义编码类型
PRE10-C。在do-while循环中包装多语句宏 PRE11-C。不要用分号结束单个语句宏定义 PRE31-C。永远不要使用包含赋值,递增,递减,易失性访问或函数调用的参数来调用不安全的宏 PRE32-C。不要在宏参数中使用预处理程序指令
答案 4 :(得分:0)
看起来不错。这是我经常使用的模式。
答案 5 :(得分:0)
要强制执行;
,请使用
#define NULLCHECK(x) do { assert((X)); } while (0)