漫谈头文件

头文件对于刚入门的新人来说是个陌生的东西,什么是头文件呢?它和我们写的.c文件有什么区别呢?这个问题对于我来说有段认识的过程

#include <stdio.h>

早期我接触C语言第一件事就是hello world的程序。当时急于去了每个东西,对hello world每个部分都刨根问底,其中最让我困惑的莫过于头文件了。我问过C语言老师,他们说你理解成一个工具箱。我去问过学长,他们说是包括了一个头文件。我去百度过,百度说std是标准库,io是输入输出流,.h是文件的后缀。说的我都很迷糊。随着后续的深入了解,我在书里还看到了这些话

我总结一下这段话里的干货

  1. stdio.h是一个文件它一般存在标准系统目录(你安装编译器的目录,像VS之类的IDE会自动帮你安装编译器)
  2. include会把.h文件里的内容原封不动的搬到.c里去
  3. “”和<>的区别在于<>会找标准系统目录,而“”会优先找文件目录,换句话说自己写的.h用“”最快,标准库里的用<>最快

.h和.c的关系

我们经常会看见有同名的.c和.h仿佛是一对对情侣,出现的时候经常成双成对出现。那么这两个是什么关系呢?我个人的理解,有点像菜单和菜谱的关系。

菜单 .h 菜谱 .c
只需要写菜名和单价,是顾客点菜的 函数的申明,全局变量的申明,一般调用函数的时候看.h 厨师做菜需要的,写清楚做菜的步骤 函数实现的部分,函数具体实现过程
  • 那么同名.c一定要包含同名.h吗?
    其实不必,如果.c中有用到.h的(比如宏定义申明,结构体申明等)则需要
  • .c和.h一定要同名吗?
    不需要,只是书写习惯。就像情侣装,不是所有情侣都爱穿情侣装,只不过是一个容易辨认的标志而已

头文件的格式

我们通常会见到很多头文件有着明显的格式

#ifndef在头文件里的的意义

#ifndef _INC_STDIO
#define _INC_STDIO
// code
#endif

这个是摘抄于stdio.h里的代码,代码里的这三行简单的来说,是通过检测有没有这个宏来确定这个文件有没有被编译,以达同一个文件之编译一次的目的。
我们分开来解析一下,当第一次运行这个头文件的时候,第一行 #ifndef 这个宏展开就是 if no define翻译成中文就是如果你没有定义_INC_STDIO这么一拖玩意儿,那就定义一下_INC_STDIO这个玩意,然后就走一遍代码,最后的#endif是宏定义#ifndef的结束符号,由于宏定义没有大括号所以需要用#endif表示判断成功运行的代码部分。
第二次进入时,因为我们之前进去时候定义了_INC_STDIO这个玩意所以这里判断不成立,就会跳到#endif后面这样code里的代码只会被执行一遍,这就是这样写为什么能实现编译只会被编译一次。
那_INC_STDIO这么一坨东西我们可以根据不同的文件去定义不同。为防止我们重复,一般情况下会采用头文件大写(点用下划线表示)比如STDIO_H。

防止重复的偷懒写法

#pragma once

同样可以达成上述效果,不过很老的版本编译器可能不支持这种写法

__cplusplus宏意义


#ifdef __cplusplus
extern "C" {#endif#ifdef __cplusplus
}
#endif

这两组宏也是常见的两兄弟。由于C++兼容C但是又有很多不同,所以在使用编译器的时候很容易混用gcc和g++。这就导致一些细节的地方和我们想象的不一样,好在g++编译器自带__cplusplus这个宏,当我们用gcc编译的时候这些东西会被忽略。当我们用g++编译的时候,我们会通过extern “C” {}把代码转换成C风格的,这样保证了混用编译器时出现和自己想象不一样的情况。

C语言高级知识锦集(一)——头文件的格式相关推荐

  1. c语言头文件格式图片_c语言中的.h头文件的格式

    #ifndef __digital_h__ #define __digital_h__ #ifndef __cplusplus extern "C"{ #endif #ifdef  ...

  2. c语言中的stdbool.h头文件,【C语言】中的stdbool.h头文件

    C语言中的stdbool.h头文件 一.相关基础知识 二.具体内容 Win7下安装的VS2015中的stdbool.h的位置为: F:\Program Files (x86)\Microsoft Vi ...

  3. c语言缺少函数头怎么办,c语言编译时如何解决缺少头文件和库的问题

    问题原因: 我们都知道我们写一个程序不可能所有东西都重头去开发,因此我们会使用一些其它人写好的文件或者说叫做库函数等.但是有时候因为路径的设置不对,或者是文件的丢失,或者是文件版本不对,或者是文件的编 ...

  4. c51语言的标准库函的头文件,C51编程中头文件的使用

    头文件在C51的编程中是不可缺少的部分.本文将对keil C中常用头文件予以说明,并就如何编写头文件进行初步介绍. 一.C51常见本征函数库 一些常见的头文件都是keil C自带的,在安装目录下的C5 ...

  5. C语言引用不同路径下的头文件的方法

    C语言学习笔记,备查: 希望在一个A.c文件中引用另一个B.c文件的方法,可以将B.c文件中的方法提取至B.h头文件,然后在B.c和A.c中分别用#include "XXX/B.h" ...

  6. C语言之预处理探究(三):头文件包含

    相关博文:C语言之预处理探究(四):#.##和预定义宏 相关博文:C语言之预处理探究(二):条件编译(Condition Compile) 相关博文:C语言之预处理探究(一):宏 参考博文:C语言的头 ...

  7. c语言中常用函数头文件,c语言中常用的函数和头文件

    头文件ctype.h 函数列表 函数类别函数目的详细说明 字符测试为字符和数字的isalnum 是否为isalpha字符 是否控制字符iscntrl 是否为数字isdigit 是否能够显示文字(空格除 ...

  8. 【C++ 语言】面向对象 ( 类定义 | 限制头文件引用次数 | 构造方法 | 析构方法 )

    文章目录 类的定义 ( 头文件引用次数控制 ) 类的实现 ( 构造函数 | 析构函数 ) CMake 编译配置 类测试 ( 构造析构调用测试 ) 类的定义 ( 头文件引用次数控制 ) 类定义 , 类一 ...

  9. 学习笔记15-C语言-预处理指令、条件编译、头文件

    预处理指令: 程序猿编写的代码不是标准C代码,并不能被真正的编译器索编译,需要一段程序把代码翻译一下. 翻译的过程叫做预处理,被翻译的代码叫做预处理指令,以#开头的都是预处理指令查看预处理的过程:gc ...

最新文章

  1. linux学习笔记(10)fdisk命令
  2. embedding_Keras嵌入层
  3. Numpy的广播与科学计算
  4. Shiro安全框架案例
  5. 博弈论学习笔记(六)纳什均衡之约会游戏与古诺模型
  6. 程序化广告 - 小抄
  7. NMEA0183协议中的GGA语句解析
  8. 高校选课系统的设计与实现
  9. SSM框架集合(2021)基础使用
  10. 【bpmn.js 使用总结】九、 Viewer 添加缩放、改色、拖动
  11. NCU SEM 发文检索2014年
  12. 简单的CSS3动画案例——奔跑的熊哥
  13. 失去了翅膀,却依然坚信只要拼搏就可以飞翔
  14. thinkphp使用编辑器kindeditor
  15. Linux man帮助文档
  16. mysql 收入_mysql 收支统计问题
  17. 【转】canvas save restore详解(包你懂,绝对不是百度里千篇一律的教程)
  18. Citrix桌面虚拟化解决方案介绍
  19. MongoDB教程(一):MongoDB云服务免费开通
  20. 关于Alipay支付宝接口--java

热门文章

  1. Joplin迁移思源笔记
  2. android 导入外部字体
  3. 直播带货直播陪玩直播约会的基础功能模块
  4. 仿抖音视频播放 基于GsyVideoPlayer+ViewPager2
  5. 护照办理旅游担保信格式(SH)
  6. vue 设置滚动条样式
  7. 男人有啥都不能有大肚子——北漂18年(91)
  8. U盘装机大师实现gpt转mbr分区表格式图文教程
  9. linux C 格式化MAC地址字符串
  10. Element Table 表格 设置滚动条以及修改边框颜色