临时宏来存储另一个宏然后还原

时间:2011-06-02 13:55:23

标签: c++ macros

我希望能够更好地控制宏,例如断言(以及一些不直接受我控制的记录宏)。所以我决定做这样的事情,期待它能够发挥作用(如果有人想知道,它不起作用的原因是undef的{​​{1}}的最后MY_ASSERT_COPY在它之前使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

2 个答案:

答案 0 :(得分:1)

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

虽然有限的便携性。

答案 1 :(得分:0)

这可能无法在所有情况下都有效,但也许您可以只是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