C++ 忽略两个C+之间的代码+;宏(防止创建静态unittest对象) #define TEST()静态RunOnCtor UNIQUENAME(uuu LINE_uuu){[]{getStaticTests()。向后推({ #定义TEST_END()});}; 结构RunOnCtor{RunOnCtor(std::function f){f();}};

C++ 忽略两个C+之间的代码+;宏(防止创建静态unittest对象) #define TEST()静态RunOnCtor UNIQUENAME(uuu LINE_uuu){[]{getStaticTests()。向后推({ #定义TEST_END()});}; 结构RunOnCtor{RunOnCtor(std::function f){f();}};,c++,c++11,c-preprocessor,C++,C++11,C Preprocessor,我已经创建了一些单元测试宏,它们既可以在头文件中工作(对于我的头文件库很有用),也可以在源文件中工作 TEST()创建RunOnCtor的静态实例,该实例在构造时执行lambda,该lambda将测试lambda插入测试的std::vectorrunAllTests()运行该向量中的每个测试 我创建了一个DISABLE_TESTdefine,它简单地放置返回在RunOnCtorlambda的开头,这样就不会向内部向量添加任何测试。但是,我想防止在禁用测试时不必要地构造静态对象 有没有一种方法可以

我已经创建了一些单元测试宏,它们既可以在头文件中工作(对于我的头文件库很有用),也可以在源文件中工作

TEST()
创建
RunOnCtor
的静态实例,该实例在构造时执行lambda,该lambda将测试lambda插入测试的
std::vector
runAllTests()
运行该向量中的每个测试

我创建了一个
DISABLE_TEST
define,它简单地放置
返回在RunOnCtor
lambda的开头,这样就不会向内部向量添加任何测试。但是,我想防止在禁用测试时不必要地构造静态对象


有没有一种方法可以完全忽略
TEST()
TEST\u END()
之间的所有内容?有点像把它评论出来。或者清空
RunOnCtor
(空结构)会使编译器避免静态构造吗

我认为这应该行得通:

#define TEST() static RunOnCtor UNIQUENAME(__LINE__) { []{ getStaticTests().push_back({
#define TEST_END() });}};
struct RunOnCtor { RunOnCtor(std::function<void()> f) { f(); } };

以下内容基于@Angew的答案,但使用标准的预处理器定义。然后,类定义类声明中的函数,C++中强制它是内联的。因为从来没有实例化过类,也从来没有调用过函数,所以从来没有生成过代码

#define TEST() struct UNIQUENAME(__LINE__) { void f() {

#define TEST_END() } };

Godbolt的编译器浏览器可以证明GCC、CLANG和ICC不会生成上述代码:

,编译器应该完全去掉
UNIQUENAME(uu_u线)结构
code和
f()
,对吗?@VittorioRomeo此代码不定义任何变量或调用任何函数,因此,在运行时不会执行任何操作。链接器可能会从最终二进制文件中删除
f()
的代码,因为它没有调用方。但即使没有,您也只会面临更大的二进制大小,而不会有任何运行时成本。
#define TEST() struct UNIQUENAME(__LINE__) { void f() {

#define TEST_END() } };
#define CAT(a, ...) PCAT(a, __VA_ARGS__)
#define PCAT(a, ...) a ## __VA_ARGS__
#define TEST() class CAT(Obfuscate_, __LINE__) { void f() {
#define TEST_END() } };

int c;
TEST()
    int a = 7;
    int b = a * 17;
    c = b + 4;
    return;
TEST_END()