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