#define 指令有两个常见用途。
第一个是控制编译器的行为。为此,我们还需要#undef、#ifdef 和#ifndef。 (还有#endif ......)
您可以通过这种方式制作“编译器逻辑”。一个常见的用途是激活或不激活代码的调试部分,如下所示:
#ifdef DEBUG
//debug code here
#endif
例如,您可以通过编写#define DEBUG 来编译调试代码
这种逻辑东西的另一个用途是避免双重包含......
例如,文件 A,#includes 文件 B 和 C。但文件 B 也包含 C。这可能会导致编译错误,因为“C”存在两次。
解决办法是这样写的:
#ifndef C_FILE_INCLUDED
#define C_FILE_INCLUDED
//the contents of header "c" go here.
#endif
#define 的另一个用途是生成宏。
最简单的,由简单的替换组成,例如:
#define PI 3.14159265
float perimeter(float radius) {
return radius*2*PI;
}
或
#define SHOW_ERROR_MESSAGE printf("An serious error happened");
if ( 1 != 1 ) { SHOW_ERROR_MESSAGE }
然后你也可以制作接受参数的宏,printf本身通常是一个宏,在头文件中用#define创建。
但不应该这样做,原因有两个:
首先,speed os 宏,与使用 inline 相同,其次,我们有 c++ 模板,允许对变量类型的函数进行更多控制。所以,使用带参数的宏的唯一原因是制作奇怪的结构,以后会很难理解,比如元编程的东西......