今天看到了
#define后面只跟一个“参数”
定义宏,并在预处理过程中将其替换为空字符串(即删除)。
这样做主要是为了标记某些内容,使程序阅读者能够清楚标记表明的意义,同时又不影响被编译的源代码。
另外,通常这些标记能被条件编译的预处理命令#ifdef、#ifndef检测到。一个重要的用法是多文件编译中防止头文件被重复包含,如:
header.h:
#ifndef _HEADER_
#define _HEADER_
/*something*/
#endif
a.c
#include"header.h"
/*something*/
main.c
#include"header.h"
/*something*/
这样无论哪个.c文件先被编译,包含header.h以后,之后进入#include后header.h中的_HEADER_已定义,那么#ifndef _HEADER_和#endif之间的代码不会被重复编译,header.h的目标代码只存在于其中一个源文件的目标代码文件中,链接器链接两个源文件编译的目标文件时不会产生因为重复编译导致的重复定义的链接错误。
从红字部分我们就可以理解了
解释
具体意思是这样的,就是在预编译时期,我们的宏要做宏替换,包含的头文件要替换为头文件里面的代码,但是注意,当你写一个大的C语言文问题件,你可能会写成为几个小的C语言文件
分别编译,链接后又成为一个主体。问题是在编写小的C语言文件时,你可能会重复的包含了头文件。比如你在a.c中包含了头文件zhangfei.h在头文件b.c中也包含头文件zhangfei.h
但其实问题就来了,因为在编译后链接到一个文件时就有了重复的东西就是那个头文件。当然如果你一开始就写为一个c文件就不会有这个问题。但是工程大了不会只写一个文件。我们如何解决那
就是自己编写一个文件,在里面我们用预编译的一些语法手段。让一个头文件只编译一次。具体语法实现就是上面写的代码。
宏定义编译前会被编译器进行替换,像你所说的只有一个标识符的情况,如果在代码里使用了这个标识符,会被替换为空,也就是相当于没加。
用来做编译开关的话
#define DEBUG
#ifdefine DEBUG
your code(输出调试信息等等)
#endif
DEBUG被定义了的话your code部分会被编译,如果DEBUG未定义,编译器则忽略your code部分。