在代码工程中,为了测试不同的场景,经常需要根据条件重新编译。为了减少代码的修改,使用了宏进行不同条件的编译。有个高级用法,网络上挺少讲解,在这分享给大家。
最常见的做法,是代码中使用
#ifdef TEST_MCARO1
.......
#else.......
#endif//或者加入逻辑运算
#if defined(TEST_MCARO1) || defined(TEST_MCARO2)
.......
#elif defined(TEST_MCARO3) && defined(TEST_MCARO4).......
#else.......
#endif
更高级一点的用法,是判断宏的不同的值进行不同的分支编译,各种逻辑判断,位运算都可以
#if TEST_MCARO5==1
............
#elif TEST_MCARO5&2............
#else............
#endif
那么,对应的qtcreator中的pro可以写:
DEFINES += TEST_MCARO1
contains(DEFINES,TEST_MCARO1){
INCLUDEPATH += ...
LIBS += ..HEADERS += ..
SOURCES += ..
QMAKE_LFLAGS += ..
TARGET = $$TARGET-AAA
} else {
TARGET = $$TARGET-BBB
}
DEFINES += "TEST_MCARO5=1"
contains(DEFINES,"TEST_MCARO5=1"){
......
} else {
contains(DEFINES,"TEST_MCARO5=2"){
......
} else {
......
}
}
另外可以在代码中添加宏内容的输出:
#define PRINT_MACRO_HELPER(x) #x
#define PRINT_MACRO(x) #x"=" PRINT_MACRO_HELPER(x)#pragma message(PRINT_MACRO(TEST_MCARO5))
在编译过程中,能看到如下信息输出:
../commonTest/main.cpp: At global scope:
../commonTest/main.cpp:11:45: note: #pragma message: TEST_MCARO5=1
#pragma message(PRINT_MACRO(TEST_MCARO5))
^
最后,BTW,通过上述的打印,发现使用#define AAA 时,AAA的值被设定为1的。