⑴ 关于C语言中的#ifndef。。。endif 的用法,求高手详解
#ifndef #endif 相当于括号括起的一段东西。
如果没有定义那个宏,则执行 这段东西。
如果没有定义那个宏,则 跳过 这段东西。
---------------
上面那段东西,如果前面有:
#define 标识符1
上面那段东西 变成:
else
{
}
------------
上面那段东西,如果前面没有定义标识符1 ,上面那段东西 变成:
程序段 1
else
{
程序段 2
else if{
程序段3 }
else {
程序段3
}
}
--------------------
#ifndef _STDIO_H_
#define _STDIO_H_
......
#endif
用于避免重复包含 stdio.h 例如:
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
第一个 #include <stdio.h> 执行后 就有了 #define _STDIO_H_
遇到第2 个 #include <stdio.h> 它的第一行 有
#ifndef _STDIO_H_ 保护。 因为有了 #define _STDIO_H_ 不能通过,第二个 #include <stdio.h> 不会重复执行 。
⑵ 头文件中的 ifndef/define/endif 干什么用
#ifndef、#define、#endif为C语言的3条预处理语句,主要用作条件编译。先介绍一下条件编译:
一般情况下,源代码文件中的所有行都参加编译,但有时需要指定一部分代码在某个条件下才被编译,这就叫做条件编译。
条件编译发生在预处理阶段,在C中,主要通过#if、#elif、#else、#ifdef、#ifndef、#endif来给一段代码附加上编译条件,然后预处理器收集满足条件的可以进行编译的代码,这样经过预处理,不满足条件的代码就不会被编译。
这3个预处理语句的功能分别为:
#ifndefsymbol
语句块
#endif
如果没有定义符号symbol,那么就编译下面指定的语句块,用endif来表示条件编译语句的结尾。
#definesymbol
定义一个符号symbol。
这三个预处理语句用在一起可以解决头文件被重复引用的问题:一个.c源程序中可能引用了多个头文件,而被源程序引用的头文件又有可能存在引用关系,比如a.h引用了b.h,然后在源程序中同时引用a.h和b.h,就会产生这个问题,这时编译器会产生符号重定义之类的错误。为了防止该问题,就需要在头文件中加入以下语句:
#ifndefsymbol
#definesymbol
头文件包含的内容
#endif
这样即可防止该头文件被重复引用。symbol一般采取以下方式命名:_头文件名_H,当然也可采取其他方式。
另外,对于有的编译器也可以在头文件中加入#pragma once来防止头文件被重复引用