【问题标题】:Temporary macro to store another macro and then reverting back存储另一个宏然后恢复的临时宏
【发布时间】:2011-06-02 13:55:23
【问题描述】:

我想更好地控制宏,例如断言(以及一些不受我直接控制的日志记录宏)。所以我决定做这样的事情,期待它能够工作(如果有人想知道,它不起作用的原因是MY_ASSERT_COPY 中的最后一个undef 在它之前使MY_ASSERT 失效)。

#ifndef ENABLE_FULL_ERROR_ASSERTS
#define MY_ASSERT_COPY MY_ASSERT
#undef MY_ASSERT
#define MY_ASSERT
#endif

// Code for my current class, which happens to be header only

#ifndef ENABLE_FULL_ERROR_ASSERTS
#undef MY_ASSERT
#define MY_ASSERT MY_ASSERT_COPY
#undef MY_ASSERT_COPY
#endif

现在我知道了几种解决方法,一种是为该文件的断言定义另一个宏,然后我可以在不影响程序任何其他部分的断言的情况下关闭它。我最初认为这是一个非常优雅的解决方案(在我发现它没有编译之前),它允许我在任何地方使用MY_ASSERT,然后简单地为特定文件关闭它。

由于上述方法不起作用,是否有一种解决方法可以让我有选择地杀死宏而不影响周围的代码,也无需定义另一个替代宏,如#define MY_ASSERT_FOR_VECTORS MY_ASSERT

【问题讨论】:

    标签: c++ macros


    【解决方案1】:

    一些编译器提供#pragma push_macro和#pragma pop_macro来保存和恢复宏状态。

    但便携性有限。

    【讨论】:

      【解决方案2】:

      这可能不适用于所有情况,但也许您可以简单地 undef 宏,根据需要定义它们,然后再次 undef 它们。

      下次您的代码使用其中一些宏时,它应该 #include 最初定义它们的头文件,以便再次定义这些宏。

      一个安全的选择是:

      #ifndef ENABLE_FULL_ERROR_ASSERTS
      #undef MY_ASSERT
      #define MY_ASSERT ....
      #endif
      
      // Code for my current class, which happens to be header only
      
      #ifndef ENABLE_FULL_ERROR_ASSERTS
      #undef MY_ASSERT
      #include "headers.h"  //etc
      // line above should redefine the macros
      #endif
      

      【讨论】:

      • "上面的行应该重新定义宏"只有当它没有标题保护时。并且没有定义任何模板函数。或者上课。或者其他任何会导致第二次包含问题的事情。另外,您需要结束并重新启动 #include 周围的任何命名空间块。
      • 是的,我想你是对的!但同样,正如我所说的“这可能不适用于所有情况”......如果push macro 不可用,这可能值得一看。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2018-10-14
      • 1970-01-01
      • 2014-04-12
      相关资源
      最近更新 更多