原文地址:https://blog.csdn.net/helloworlddm/article/details/76785397
本文为转载,如有侵权,请联系删除。

理论上来说C文件与h文件里的内容,只要是C语言所支持的,无论写什么都可以的,比如你在h文件中写函数体,只要在任何一个C文件包含此.h文件就可以将 这个函数编译成目标文件的一部分(编译是以C文件为单位的,如果不在任何C文件中包含此.h文件的话,这段代码就形同虚设),你可以在C文件中进行函数声 明,变量声明,结构体声明,这也不成问题!!!那为何一定要分成h文件与C文件呢?又为何一般都在h文件中进行函数,变量声明,宏声明,结构体声明呢?而 在C文件中去进行变量定义,函数实现呢??原因如下:

  1. 如果在h文件中实现一个函数体,那么如果在多个C文件中引用它,而且又同时编译多个C文件,将其生成的目标文件连接成一个可执行文件,在每个引用此h 文件的C文件所生成的目标文件中,都有一份这个函数的代码,如果这段函数又没有定义成局部函数,那么在连接时,就会发现多个相同的函数,就会报错

  2. 如果在h文件中定义全局变量,并且将此全局变量赋初值,那么在多个引用此h文件的C文件中同样存在相同变量名的拷贝,关键是此变量被赋了初值,所以编 译器就会将此变量放入DATA段,最终在连接阶段,会在DATA段中存在多个相同的变量,它无法将这些变量统一成一个变量,也就是仅为此变量分配一个空 间,而不是多份空间,假定这个变量在h文件没有赋初值,编译器就会将之放入BSS段,连接器会对BSS段的多个同名变量仅分配一个存储空间

  3. 如果在C文件中声明宏,结构体,函数等,那么我要在另一个C文件中引用相应的宏,结构体,就必须再做一次重复的工作,如果我改了一个C文件中的一个声 明,那么又忘了改其它C文件中的声明,这不就出了大问题了,程序的逻辑就变成了你不可想象的了,如果把这些公共的东东放在一个头文件中,想用它的C文件就 只需要引用一个就OK了!!!这样岂不方便,要改某个声明的时候,只需要动一下h文件就行了

  4. 在h文件中声明结构体,函数等,当你需要将你的代码封装成一个库,让别人来用你的代码,你又不想公布源码,那么人家如何利用你的库呢?也就是如何利用 你的库中的各个函数呢??一种方法是公布源码,别人想怎么用就怎么用,另一种是提供头文件,别人从头文件中看你的函数原型,这样人家才知道如何调用你写的 函数,就如同你调用printf函数一样,里面的参数是怎样的??你是怎么知道的??还不是看人家的头文件中的相关声明啊!!!当然这些东东都成了C标 准,就算不看人家的头文件,你一样可以知道怎么使用

关于C语言中.h和.c文件相关推荐

  1. 简述C语言中.h文件和.c文件作用和区别

    简述C语言中.h文件和.c文件作用和区别 在c语言学习过程中,对.h文件和.c文件不甚了解,参考其他资料后对它进行简要分析: .h文件和.c文件作用 使用.h文件和.c文件的原因 .h文件和.c文件作 ...

  2. C语言中:在头文件中使用static定义变量意味着什么?

    C语言中:在头文件中使用static定义变量意味着什么? 看到有一位同学在头文件中这么写: static const wchar_t* g_str1 = - static const wchar_t* ...

  3. C语言中.h文件和.c文件如何理解?看完详细解析,小白也能懂!

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:        1.预处理阶段 2.词法与语法分析阶段        3.编译 ...

  4. c语言中.h文件和.cpp文件解析

    理论上来说cpp文件与头文件里的内容,只要是C语言所支持的,无论写什么都可以的,比如你在头文件中写函数体实现,任何一个cpp文件包含此头文件就可以将这个函数编译成目标文件的一部分(编译是以cpp文件为 ...

  5. C语言中.h开头文件的书写和用法

    #include<stdio.h> 这种头文件可以自己书写. #include<>与#include""的区别: #include<>直接在系统 ...

  6. c语言中.h文件中的宏定义,endian.h这个头文件里面的宏可以直接用么?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 endian.h头文件中以宏的形式定义了大端字节序.小端字节序和混合字节序 #define __LITTLE_ENDIAN 1234 #define __ ...

  7. c语言中count的头文件,求助C语言大佬 , 只会写到一个.c文件里 ,不会用.h头文件...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 简答题] 实验任务:学生成绩统计 从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能: (1)统计不 ...

  8. c语言.h文件怎么写,关于C语言中.h文件怎么书写?

    其实,头文件的功能就是申明资源,特别是多个C文件的时候,简单地说,就像是库文件. 例如:reg51.h头文件,就是单纯的申明资源,系统的其它头文件,还有申明函数的. 如果自己编写头文件,就可以包含这两 ...

  9. C/C++ 语言中.h文件和.c文件详细解析 引用 .c和.h文件的区别

    参考:http://blog.csdn.net/wuan584974722/article/details/30362405 简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编 ...

最新文章

  1. python dos攻击_利用SMB漏洞DoS攻击任何Windows系统
  2. Error in exists(x): 第一个参数不对
  3. STM32 驱动例程
  4. HDU 1166 敌兵布阵(线段树单点加区间查询)
  5. python报告 No module named 'main'错误
  6. kotlin 和java 混编
  7. 《程序员的呐喊》读书笔记
  8. 重装系统win10提示磁盘布局不受UEFI固件支持怎么办
  9. springbatch开启任务的两种方式
  10. 设计模式之——桥接模式
  11. MooseFs的使用与操作
  12. 商旅业务知识-航信(ETERM)系统
  13. C++程序员常用工具集
  14. 清华大学计算机竞赛自主招生,清华大学自主招生竞赛有哪些要求
  15. 接下来是 Downward API,它的作用是:让 Pod 里的容器能够直接获取到这个 Pod API 对象本身的信息。
  16. TCL中变量嵌套使用
  17. QC —什么是量子计算机?
  18. git官网 中文教程 使用手册 说明书
  19. Maven配置nexus私服地址
  20. 不为人知的几个微信实用技巧

热门文章

  1. Kubernetes(k8s)入门到实战教程笔记总结
  2. Python | 阿尔法基本语法元素练习题
  3. douyin / kuaishou / huoshan / tiktok 高版本抓包 hook方案
  4. linux使用Cloudreve搭建个人私有云
  5. 旧照片修复-模糊图片变清晰-2023年度最强神器 codeformer
  6. 转:对历史和常识的无知
  7. 神经网络辐射场NeRF、实时NeRF Baking、有向距离场SDF、占用网络Occupancy、NeRF 自动驾驶
  8. SAP常见问题及解决方法
  9. 分布式RPC框架dubbo、motan、rpcx、gRPC、thrift简介与性能比较
  10. 09_51入门_串口通信