【问题标题】:How to redefine a macro using its previous definition如何使用之前的定义重新定义宏
【发布时间】:2011-03-06 07:57:50
【问题描述】:

假设我有以下宏:

#define xxx(x) printf("%s\n",x);

现在在某些文件中,我想在不更改其名称的情况下使用此宏的“增强”版本。新版本探索了原版本的功能,做了更多的工作。

#define xxx(x) do { xxx(x); yyy(x); } while(0)

这当然给了我重新定义警告,但为什么我得到 'xxx' 没有在这个范围内声明?我应该如何正确定义它?

编辑:根据这个http://gcc.gnu.org/onlinedocs/gcc-3.3.6/cpp/Self_002dReferential-Macros.html 应该是可能的

【问题讨论】:

  • 那个自引用宏页面正在描述防止宏替换无限递归的规则。这并不意味着您可以定义一个宏来表示不止一件事。

标签: macros c-preprocessor


【解决方案1】:

这并不完全符合您的要求,但它可以提供帮助。

您可以先#undef 一个宏,然后再给它一个新的定义。

例子:

#ifdef xxx
#undef xxx
#endif
#define xxx(x) whatever

不过,我从未听说过(或见过)递归宏。我觉得不可能。

【讨论】:

  • 请注意,#ifdef 块不是必需的。您可以在名称上使用#undef 将其取消定义为宏,即使该名称当前未定义为宏。所以,你可以简单地#undef xxx 然后#define xxx...
  • @James McNellis:很高兴知道。谢谢!
【解决方案2】:

不可能。宏可以使用其他宏,但它们使用的是扩展时可用的定义,而不是定义时。而且 C 和 C++ 中的宏不能递归,所以新宏中的 xxx 不会被扩展,而是被视为一个函数。

【讨论】:

    【解决方案3】:

    您将无法重用宏的旧定义,但您可以取消定义并创建新定义。希望复制和粘贴不会太复杂。

    #ifdef xxx
    #undef xxx
    #endif
    #define xxx(x) printf("%s\n",x);
    

    我的建议是定义一个xxx2 宏。

    #define xxx2(x) do { xxx(x); yyy(x); } while(0);
    

    【讨论】:

    • 请注意,#ifdef 块不是必需的。您可以在名称上使用#undef 将其取消定义为宏,即使该名称当前未定义为宏。所以,你可以简单地#undef xxx 然后#define xxx...
    • 酷!不知道那件事。省略#ifdef 使代码更具可读性。
    • 我有一个 Project-Prefix.pch,我在其中设置了我的应用程序的应用程序通用的默认值,然后为发生变化的事情设置了特定于应用程序的 Prefix.pch。当我重新定义宏并且无法弄清楚如何在预处理器中关闭该警告时,我收到了警告“重新定义了词汇或预处理器问题宏”。 #undef PLAY_BUTTON_TITLE 然后#define PLAY_BUTTON_TITLE @"Start" 抑制错误并重新定义按钮。
    【解决方案4】:

    自引用宏根本不起作用:

    http://gcc.gnu.org/onlinedocs/cpp/Self_002dReferential-Macros.html#Self_002dReferential-Macros

    如果您使用 C++,您可以使用模板函数和命名空间获得相同的结果:

    template <typename T> void xxx( x ) {
            printf( "%s\n", x );
    }
    
    namespace my_namespace {
    
    template <typename T> void xxx( T x ) {
            ::xxx(x);
            ::yyy(x);
    }
    
    }
    

    【讨论】:

      【解决方案5】:

      如果我们知道'xxx'宏中'x'参数的类型,我们可以通过在函数中使用它来重新定义宏,然后将'xxx'宏定义为这个函数

      “xxx”宏的原始定义:

      #define xxx(x) printf("xxx %s\n",x);
      

      在某个文件中制作'xxx'宏的增强版:

      /* before redefining the "xxx" macro use it in function 
       * that will have enhanced version for "xxx" 
       */
      static inline void __body_xxx(const char *x)
      {
          xxx(x);
          printf("enhanced version\n");
      }
      
      #undef  xxx
      #define xxx(x) __body_xxx(x)
      

      【讨论】:

        【解决方案6】:

        发件人:https://gcc.gnu.org/onlinedocs/gcc/Push_002fPop-Macro-Pragmas.html

        #define X  1
        #pragma push_macro("X")
        #undef X
        #define X -1
        #pragma pop_macro("X")
        int x [X];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-25
          • 1970-01-01
          • 2021-07-26
          • 2012-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多