C / C ++条件宏组合

时间:2013-12-03 09:13:35

标签: c++ c macros

我可以在为C或C ++编写代码时组合宏吗?如果没有,为什么?如果是,怎么样?

我对如何解决以下问题感兴趣(不正确且不编译!!!)的想法:

#define FREE(x) if((x)) {                                         \
#ifdef MEM_DEBUG_                                                 \
    fprintf(stderr, "free:%p (%s:%d)\n", (x), __FILE__, __LINE__); \
#endif                                                             \
    free((x)); }

所以,我想要实现的是:

我希望定义宏FREE,如果我定义了MEM_DEBUG,它将包含一个额外的行。

我知道,为了解决这个问题,我可以根据FREEMEM_DEBUG创建两个定义,例如:

#ifdef MEM_DEBUG
  #define FREE() something
#else 
  #define FREE() something else
#endif

但如果有另一种方式,我只是好奇!

2 个答案:

答案 0 :(得分:4)

是的,你可以定义宏来封装设置标志时做某事的想法。

#ifdef MEM_DEBUG
#   define IF_MEM_DEBUG( ... ) __VA_ARGS__
#   define IF_MEM_NDEBUG( ... )
#else
#   define IF_MEM_DEBUG( ... )
#   define IF_MEM_NDEBUG( ... ) __VA_ARGS__
#endif

#define FREE(x) \
if((x)) { \
    IF_MEM_DEBUG( \
        fprintf(stderr, "free:%p (%s:%d)\n", (x), __FILE__, __LINE__); \
    ) \
    free((x)); \
}

答案 1 :(得分:2)

不可以,在宏定义中放置预处理指令(以#开头的行)。所以你唯一能做的就是你提到的第二种方法 - 把定义放在条件中。

当然,如果你正在处理一个更大的宏,并且只有一部分是#if依赖的,你可以将依赖部分隔离成一个单独的宏并在较大的宏中使用它来保持不同的定义尽可能小。