c++ 禁用宏后跟块

bfnvny8b  于 2024-01-09  发布在  其他
关注(0)|答案(2)|浏览(91)

对于像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)


它只用于调试/重构,而不用于生产代码

jdzmm42g

jdzmm42g1#

有没有一种快速简单的方法可以像上面的assert()一样禁用这样的宏,这样编译器甚至不会尝试编译下面的块,所以它是否包含语法错误或未定义的符号也无关紧要?
将整个函数定义封装在#ifdef中。
你可以把整个函数定义放在宏定义中,当不运行测试时,宏定义会扩展为空。

#if run_tests
#define TEST(_name_, ...) void TestFixtureUniqueName(_name_)::Run(Argument& argument) __VA_ARGS__
#else
#define TEST(_name_, ...)
#endif

TEST(_name_,
{
   int i = 13;
   foo();
}
)

字符串
但是总的来说,使用^这样的宏很快就会变得不可维护和不可读。考虑一下根本不使用任何宏,只是把它写出来,只是把函数定义封装在一个简单的#ifdef中。

au9on6nz

au9on6nz2#

您需要将函数的代码包含在#ifdef块中。应注意在预处理阶段之后,最终输出应语法正确。

相关问题