使用诸如
assert()
之类的宏,我可以像 #define assert(_expr_) (void)0
一样定义它,使其在编译时被删除,并且编译器不会尝试评估其参数。
但是我有一个宏,后面跟着一个函数体块。在这种情况下,它是单元测试框架的一部分,并评估类的成员函数定义,例如:
#define TEST(_name_) void TestFixtureUniqueName(_name_)::Run(Argument& argument)
因此编译器会期望它后面跟着
{ ... }
函数体块。在它的内部,它引用在此范围内定义的变量(类的成员和参数)。
是否有一种快速简便的方法可以以与上面
assert()
类似的方式禁用这样的宏,这样编译器甚至不会尝试编译以下块,因此无论它是否包含语法错误或未定义的符号?
目前我正在做类似的事情
#define TEST(_name_) static void __NeverRun##_name_(MemberType1& m_member1, MemberType2& m_member2, Argument& argument)
它仅适用于调试/重构期间使用,不适用于生产代码
您可以将该宏包含在另一个
#ifdef
块中。如果您想要评估宏的扩展表达式,请预先适当设置 define
。
例如:
#ifdef ENABLE_TEST
#define TEST(_name_) void TestFixtureUniqueName(_name_)::Run(Argument& argument)
#else
#define TEST(_name_) void(0)
#endif