#ifndef #define #endif 的作用

一.头文件本身不会被编译 除非被.cpp文件包含 才会被编译 被一个.cpp文件包含 那么整个程序只有一份.h的 相当于说真正会成为可执行代码的只有源代码文件而头文件只是起辅助作用用到时包含的时候才编译一次 包含一次那么一个头文件与一个源文件组成一份然后被编译器编译成一个目标文件(UNIX为.o  windows:.obj),然后运行时 从主函数进入 也就是说头文件你写了 并不会被编译 只有在被源文件包含才会copy一份作为变量或函数声明 当然如果你在头文件定义全局变量了 那就定义了 而不用担心头文件定义了一个变量 一个源文件包含会不会有两个变量引起重复错误 是不会的

   

但如果多个源文件包含一个头文件 而头文件有定义变量/函数 

那就会有多个同名实体编译就通不过(t)

参考:

-------------------------------------------------------

ifndef 是if not  define的缩写,是宏定义的一种 但其功能是预处理(1.宏定义 2.文件预包含3.条件编译)中的条件编译,

有点像 if not但是比之if not

#include<stdio.h>

这是一个头文件但是一般编译器会将库文件自动连接进来 所以printf函数的声明在.h而实现在包含的lib/dll中

相当于一个大的工程分成了好几个.cpp而.h文件你不包含在源文件的话是不会执行的

所以既然不能阻止多个源文件包含同一个含有定义的头文件那 ifndef又能干什么的

是防止这种情况:ifndef这套条件编译是为了防止同一个.c文件中包含多个相同.h文件的(比如有一个.c文件包含了a.h,a.h又包含了b.h,那么当你在这个.c文件中同时包含了a.h和b.h时,因为有上面的条件编译的关系而不会出错)。

就是在一个源文件中不会套娃娃出错 套好几个

一般是作用于头文件 有点类似 if()else()选择语句,但是吧 比那些节省资源快速 是在编译中弄得 而不是在执行中

2.初次之外 #program once也是这个功能 只(一个源文件内)只编译一次 但是ifndef 有些不同

(1)  你无法对一个头文件中的一段代码作pragma once声明,而只能针对文件。

(2)因为#ifndef受C/C++语言标准的支持,不受编译器的任何限制;

 而#pragma once方式却不受一些较老版本的编译器支持,一些支持了的编译器又打算去掉它,所以它的兼容性可能不够好。

参考1.

1.https://www.cnblogs.com/challenger-vip/p/3386819.html

2.

发布了146 篇原创文章 · 获赞 0 · 访问量 4525

猜你喜欢

转载自blog.csdn.net/qq_40272523/article/details/104710094