YouTube视频链接
C++的宏
本文是ChernoP55视频的学习笔记。
如下代码
#includeint main(){std::cin.get();}
我们可以定义一个宏而不是每次都写std::cin.get(),先写上一个#define。
#include//发生在编译器的预处理阶段#define WAIT std::cin.get() //注意无需分号int main(){WAIT;}
宏还可以发送参数,若不想写std::cout。
#include#define LOG(x) std::cout << x << std::endlint main(){LOG("Hello");std::cin.get();}
在实际工作中,常常在release版本中去掉所有的日志代码,但是在debug版本中保留。我们可以通过宏做到这一点。首先要修改项目属性。
增加如下代码
#ifdef PR_DEBUG#define LOG(x) std::cout << x << std::endl#else#define LOG(x) //替换成空#endif
可以发现在Debug和Release模式下VS高亮显示的不同。
运行代码发现Debug模式下打印日志,和Release模式下什么都不打印。
这里的ifdef用的不好,我们可以让PR_DEBUG=1,给它定义一个实际的值来控制PR_DEBUG。
#include#define PR_DEBUG 0#if PR_DEBUG == 1#define LOG(x) std::cout << x << std::endl#else#define LOG(x)#endifint main(){LOG("Hello");std::cin.get();}
也可以通过修改属性,在Debug模式下定义PR_DEBUG=1。
#include#if PR_DEBUG == 1#define LOG(x) std::cout << x << std::endl#else#define LOG(x)#endifint main(){LOG("Hello");std::cin.get();}
因为我们定义了PR_RELEASE;,可以使用elif defined(PR_RELEASE)。
#include#if PR_DEBUG == 1#define LOG(x) std::cout << x << std::endl#elif defined(PR_RELEASE) //defined是检测函数,检测预定义是否存在#define LOG(x)#endifint main(){LOG("Hello");std::cin.get();}
用#if 0 可以将整个代码块禁用。
#include#if 0#if PR_DEBUG == 1#define LOG(x) std::cout << x << std::endl#elif defined(PR_RELEASE)#define LOG(x)#endif#endifint main(){LOG("Hello");std::cin.get();}
还可以使用反斜杠来写多行的宏,因为宏必须在同一行。
#include#define MAIN int main() { std::cin.get();}MAIN