c++ - C/C++ 条件宏组合

标签 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,它将包含一个额外的行。

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

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

但我只是好奇是否还有其他方法!

最佳答案

是的,您可以定义宏来封装设置标志时执行某些操作的想法。

#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)); \
}

关于c++ - C/C++ 条件宏组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20347006/

相关文章:

c - OpenGL 加载多个纹理 - 不工作

c - 寄存器的结构体还是矩阵?

c++ - 懒惰的 __FILE__ 和 __LINE__ 人口

c++ - ncurses getch() 跳过每个第二个字符

c++ - 通过引用返回通过引用传递的 vector 的实用程序

c - 结构体指针的引用

c - (宏创建)C 中的语法错误

lambda - 如何在 Clojure 中将 lambda 实现为名为 "lambda"的函数?

c++ - 如何从模板基类派生非模板类

c++ - 将 lexical_cast 字符串提升为两倍