C++ 临时宏存储另一个宏,然后恢复

C++ 临时宏存储另一个宏,然后恢复,c++,macros,C++,Macros,我希望对断言(以及一些不直接受我控制的日志宏)等宏有更多的控制。所以我决定这样做,希望它能起作用(万一有人想知道,它不起作用的原因是MY_ASSERT\u COPY的最后一个undef使它前面的MY_ASSERT无效) 现在我知道了一些解决方法,一种是为该文件的断言定义另一个宏,然后我可以在不影响程序任何其他部分的断言的情况下关闭该宏。我最初认为这是一个非常优雅的解决方案(在我发现它没有编译之前),它允许我在任何地方使用MY_ASSERT,然后对特定文件关闭它 由于上述方法不起作用,是否有一种变

我希望对断言(以及一些不直接受我控制的日志宏)等宏有更多的控制。所以我决定这样做,希望它能起作用(万一有人想知道,它不起作用的原因是
MY_ASSERT\u COPY
的最后一个
undef
使它前面的
MY_ASSERT
无效)

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


由于上述方法不起作用,是否有一种变通方法可以让我有选择地终止宏,而不会影响周围的代码,也不会定义另一个替代宏,如
\define MY_ASSERT\u FOR_VECTORS MY_ASSERT
一些编译器提供
\pragma push_macro
\pragma pop_macro
来保存和恢复宏状态


但可移植性有限。

一些编译器提供
#pragma push_宏
#pragma pop_宏
来保存和恢复宏状态


但可移植性有限。

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

下次代码使用这些宏时,它应该
#包括最初定义它们的头文件,以便再次定义这些宏

一个安全的选择是:

#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

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

下次代码使用这些宏时,它应该
#包括最初定义它们的头文件,以便再次定义这些宏

一个安全的选择是:

#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周围的所有命名空间块。是的,我想您是对的!但是,正如我所说,“这可能不适用于所有情况”。。。如果
推送宏
不可用,这可能值得一看。只有在没有标题保护的情况下,“上面的行应该重新定义宏”。并且不定义任何模板函数。或者上课。或任何其他可能导致第二次包含问题的内容。另外,您需要结束并重新启动#include周围的所有命名空间块。是的,我想您是对的!但是,正如我所说,“这可能不适用于所有情况”。。。如果
推送宏
不可用,这可能值得一看。