禁用宏,然后禁用块

问题描述 投票:0回答:1

使用诸如

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)

它仅适用于调试/重构期间使用,不适用于生产代码

c++ macros c-preprocessor
1个回答
0
投票

您可以将该宏包含在另一个

#ifdef
块中。如果您想要评估宏的扩展表达式,请预先适当设置
define

例如:

#ifdef ENABLE_TEST
  #define TEST(_name_) void TestFixtureUniqueName(_name_)::Run(Argument& argument)
#else
  #define TEST(_name_) void(0)
#endif
© www.soinside.com 2019 - 2024. All rights reserved.