#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 在那里做什么。

CERT C的一些优秀宏观做法安全编码维基

  

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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top