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::endl int 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) #endif int 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) #endif int 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) #endif int 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 #endif int main() { LOG("Hello"); std::cin.get(); }
还可以使用反斜杠来写多行的宏,因为宏必须在同一行。
#include#define MAIN int main() { std::cin.get(); } MAIN



