C:有效的宏用法

时间:2009-09-10 10:19:38

标签: c macros

#ifndef MACROS_NULLCHECK_H_
#define MACROS_NULLCHECK_H_

#include <assert.h>

#define NULLCHECK(x) assert(x != (void *) 0);

#endif

如果我使用上面的样式作为模板来声明宏,你会有什么附带条件?

6 个答案:

答案 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)