2011-06-02 64 views
1

我想更多的控制宏,如断言(和一些不直接在我的控制下的日志宏)。所以我决定做这样的事情,期待它的工作(如果有人想知道,它不起作用的原因是最后undefMY_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

回答

1

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

虽然有限的便携性。

0

这可能不适用于所有情况,但也许你可以简单地使用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 
+0

“上面一行是重新定义宏”只有当它没有一个头文件保护。并没有定义任何模板功能。或类。或者其他任何会导致第二次包含问题的东西。另外,您需要结束并重新启动#include周围的任何名称空间块。 – IronMensan 2011-06-02 18:15:17

+0

是的,我想你是对的!但是,正如我所说的那样,“这可能不适用于所有情况”......如果“push macro”不可用,这可能值得一看。 – 2011-06-03 10:53:03

相关问题