想象一下,我有一些“断言式”功能,如果特定的宏被定义,则以某种方式声明宏,否则以另一种方式声明宏:
在这里,
然而,我想做的是在包含文件之前允许用户使用自己的宏覆盖
// in some header assert2.hpp
#ifdef NO_ASSERT2
#define assert2(x)
#else
#define assert2(x) assert2_handler(x);
#endif
在这里,
NO_ASSERT2
宏与标准assert(3)中的 NDEBUG
宏非常相似。然而,我想做的是在包含文件之前允许用户使用自己的宏覆盖
NO_ASSERT2
检查。例如,如果你像这样包含assert2.hpp
:#define NO_ASSERT_KEY NO_ASSERT_CUSTOM
#include "assert2.hpp"
接着,对于这个翻译单元,将检查宏NO_ASSERT_CUSTOM
而不是默认的NO_ASSERT2
。
它不一定要完全像上面那样工作 - 我只需要一种以每个文件为基础覆盖行为的方法,而不需要在包含位置处写入超过1行引导文本。
NO_ASSERT_KEY
,您期望发生什么? - CoffeeTableEspresso-DNO_ASSERT_CUSTOM
)定义了NO_ASSERT_CUSTOM
,则assert2
的定义将是虚拟的,就像在原始示例中定义了NO_ASSERT2
一样。也就是说,NO_ASSERT_CUSTOM
取代了NO_ASSERT2
的位置。 - BeeOnRopeNO_ASSERT_KEY
时,我们将始终检查NO_ASSERT_CUSTOM
,还是检查NO_ASSERT_KEY
定义的任何值? - CoffeeTableEspressoNO_ASSERT_KEY
时,您可以检查宏,其 name 是NO_ASSERT_KEY
值。或者使用其他机制:它不必完全像这样工作(但必须有多个自定义键,即仅检查NO_ASSERT_CUSTOM
不够)。 - BeeOnRope