代码之家  ›  专栏  ›  技术社区  ›  Ande Turner

C:有效的宏用法

  •  3
  • Ande Turner  · 技术社区  · 16 年前
    #ifndef MACROS_NULLCHECK_H_
    #define MACROS_NULLCHECK_H_
    
    #include <assert.h>
    
    #define NULLCHECK(x) assert(x != (void *) 0);
    
    #endif
    

    如果我使用上述样式作为声明宏的模板,您会有什么限制?

    6 回复  |  直到 16 年前
        1
  •  14
  •   AProgrammer    16 年前
    • 在参数周围加上括号(它可以防止传递表达式时出现问题)

    • 不要放;最后(使用更自然)

      #定义nullcheck(x)断言((x)!=(空隙*)0)

        2
  •  3
  •   AAT    16 年前

    一般来说,在扩展过程中,应该始终将宏参数放在括号中,即在您的情况下

    assert((x) != (void*) 0)
    

    这是因为如果您不这样做,那么您传入的任何表达式(而不是简单变量)可能会扰乱变量扩展。

    我还建议您不要将分号放在宏定义的末尾,这样您就必须像这样调用它

    NULLCHECK(pSomething);
    

    它看起来更像C,与代码的其余部分更一致。

        3
  •  3
  •   RichieHindle    16 年前

    我可能做的一个改变是评论结束 #endif :

    #endif  // MACROS_NULLCHECK_H_
    

    这样更容易理解 #结束语 当文件比屏幕长时正在执行此操作。

        4
  •  1
  •   Andrew Keeton ShuggyCoUk    16 年前

    一些良好的宏观实践 CERT C Secure Coding Wiki :

    pre00-c.更喜欢内联或静态函数像宏一样工作
    pre01-c.在参数名周围的宏中使用括号
    pre02-c.宏替换列表应加括号
    pre03-c.首选typedef来定义编码类型
    pre10-c.在do-while循环中包装多语句宏
    pre11-c.不要用分号结束单个语句宏定义
    pre31-c.不要用包含赋值、递增、递减、易失性访问或函数调用的参数调用不安全的宏
    pre32-c.不要在宏参数内使用预处理器指令

        5
  •  0
  •   Paul Mitchell    16 年前

    看起来不错。这是我经常使用的一种模式。

        6
  •  0
  •   MSalters    16 年前

    执行 ; 使用

    #define NULLCHECK(x) do { assert((X)); } while (0)