对于像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)
型
它只用于调试/重构,而不用于生产代码
2条答案
按热度按时间jdzmm42g1#
有没有一种快速简单的方法可以像上面的assert()一样禁用这样的宏,这样编译器甚至不会尝试编译下面的块,所以它是否包含语法错误或未定义的符号也无关紧要?
将整个函数定义封装在
#ifdef
中。你可以把整个函数定义放在宏定义中,当不运行测试时,宏定义会扩展为空。
字符串
但是总的来说,使用^这样的宏很快就会变得不可维护和不可读。考虑一下根本不使用任何宏,只是把它写出来,只是把函数定义封装在一个简单的
#ifdef
中。au9on6nz2#
您需要将函数的代码包含在
#ifdef
块中。应注意在预处理阶段之后,最终输出应语法正确。