【问题标题】:How to store a macro in another macro?如何将一个宏存储在另一个宏中?
【发布时间】:2014-03-24 17:38:07
【问题描述】:

我有一个宏 DDLogDebug(...),我想执行以下操作

#define _DDLogDebug(arg...) DDLogDebug(args)
#undef DDLogDebug
#define DDLogDebug(args...) doSomething(); _DDLogDebug(arg...)

但它不起作用。而不是#define _DDLogDebug(arg...) DDLogDebug(args),我需要一个将宏DDLogDebug 的内容“存储”到_DDLogDebug 的命令。

  • 存在类似的东西吗?

  • 如果要修改未公开定义的宏,应该怎么做?

【问题讨论】:

    标签: macros c-preprocessor


    【解决方案1】:

    你不能用纯粹的标准预处理器做这样的事情。

    原因是宏定义不像例如主要语言中的函数定义:在您定义 _DDLogDebug 时,它实际上并没有链接到 DDLogDebug 的定义 - 它存储正是您编写的内容。在宏被用于任何定义之外的程序之前,它不会尝试实际找到任何名称的扩展。到那时,DDLogDebug 的定义已经消失了。

    这实际上是一种有价值的预期行为,因为它允许使用像X-macros 这样的技术:一个定义可以提供一个框架并让不同的调用上下文决定如何以不同的方式实际使用它。外部宏不仅不依赖于编写时可用的定义,而且其内容的含义可以在整个程序中更改,而无需更改其结构。

    如果您无法解决此问题,您可能会遇到非标准但受到广泛支持的push_macro and pop_macro directives


    push和pop的使用示例:

    #define FOO 123
    #pragma push_macro("FOO")
    #undef FOO
    FOO
    #pragma pop_macro("FOO")
    FOO
    

    通过gcc -E 运行它,您会看到它发出FOO(换行符)123。与 Clang 一起使用。

    【讨论】:

    • 你知道这些指令在为 OSX 编程时是否可用吗?看来他们不是。
    猜你喜欢
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多