头文件与makefile_FZDTN的博客-程序员宝宝

头文件应该写什么:
问题:头文件可能被任何的源文件包含,意味着头文件的内容会在多个目标文件中存在,合并时不能冲突
重点:头文件中只能编写声明语句,不能有定义语句
全局变量声明
函数声明
宏常量
宏函数
typedef 类型重定义
结构、联合、枚举

gcc -c main.c 变成main.o
gcc a.o main.o 连接后./a.out
头文件的编写规则:
1、为每个.c文件写一份.h文件,.h文件是对.c文件的说明
2、如果需要用到某个.c文件的变量、函数、宏,只需要把它的头文件导入
3、.c文件也需要导入自己.h文件,目的是为了让声明与定义一致

头文件的相互包含:
假如a.h中包含了b.h的内容,而b.h又需要包含a.h的内容,这种会导致编译出错

解决方案:把a.h中需要的内容,和a.h中需要的内容提取出来,写成一个c.h

错误: 未知的类型名‘XXXX’ 一般都是因为头文件相互包含所导致的,也可能因为复制粘贴时头文件宏名忘记改
Makefile 是由一系列编译指令组成的可执行文件,也叫做编译脚本
在终端执行make命令会自动执行Makefile脚本中的编译指令,它可以根据文件的最后修改时间,来判断哪些文件需要被编译,哪些文件不需要被编译,从而大大地提高编译效率

编译规则:
1、 如果该项目没有编译过,则编译全部的.c文件,并链接成可执行文件
2、 如果某些.c文件被修改,则只编译修改过的.c文件,并重新链接新的可执行文件
3、 如果某些.h文件被修改,所有依赖它的.c都要重新编译并链接

一个最简单的Makefile脚本:
执行目标:依赖
编译指令
被依赖的目标1:依赖的文件
编译指令
被依赖的目标2:依赖的文件
编译指令
。。。
负责清理的执行目标:
rm…

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/FZDTN/article/details/115611799

智能推荐

多实例UML时序图(sequence-diagram)互相关联_zhangxiaobo0715的博客-程序员宝宝

1. 语法: ref : https://plantuml.com/zh/sequence-diagram2. example :actor USER1participant APP1database SERVERparticipant APP2actor USER2USER1 -> APP1 : input HiAPP1-> SERVER : send HiSERVER-> APP2 : transmit HiAPP2.

oracle与mysql跨库连接_Oracle 跨库查询表数据(不同的数据库间建立连接)_weixin_39738380的博客-程序员宝宝

1.情景展示当需要从A库去访问B库中的数据时,就需要将这两个库连接起来;两个数据库如何实现互联互通,在oracle中,可以通过建立DBLINK实现。2.解决方案2018/12/05第一步:创建DBLINK前提:要建立通信的2个数据库的IP必须实现可以相互访问。方式一:使用plsql实现选中“database link”-->右键-->新建名称:创建的DBLINK的名称,通过它来完成B...

Referenced file contains errors (http://struts.apache.org/dtds/struts-2.3.dtd). For more information_爆发的~小宇宙的博客-程序员宝宝

Multiple annotations found at this line:- - Referenced file contains errors (http://struts.apache.org/dtds/struts-2.3.dtd). For more information, right click on the message in the Problems View an

html 设置min height,HTML min-height用法总结_海尔歆的博客-程序员宝宝

min-height 属性设置元素的最低高度,该属性值会对元素的高度设置一个最低限制。因此,元素可以比指定值高,但不能比其矮。不允许指定负值。下面我们就对min-height的用法进行汇总:为什么我们要使用min-height和max-height样式属性?Css min-height应用地方解释我们有时设置一个对象盒子时候避免对象没有内容时候不能撑开,但内容多少不能确定所以又不能固定高度,这个时...

python编程从入门到实践第九章_《Python编程:从入门到实践》第九章笔记_七231fsda月mkq的博客-程序员宝宝

9.1 创建和使用类9.1.1 创建Dog类class Dog():def __init__(self,name,age): #3"""初始化属性name和age"""self.name = nameself.age = agedef sit(self):print(self.name.title() + "is now sitting")def roll_over(self):print(sel...

AttributeError: 'module' object has no attribute 'lock'_cuichen4524的博客-程序员宝宝

_lock_sqlite3=threading.lock()一直,AttributeError: 'module' object has no attribute 'lock'原来:_lock_sqlite3=t...

随便推点

Springboot+SpringSecurity实现图片验证码登录_山河已无恙的博客-程序员宝宝_http.addfilterbefore(verifycodefilter, usernamepas

这个问题,网上找了好多,结果代码都不全,找了好多,要不是就自动注入的类注入不了,编译报错,要不异常捕获不了浪费好多时间,就觉得,框架不熟就不能随便用,全是坑,气死我了,最后改了两天.终于弄好啦;问题主要是:返回的验证码不知道在SpringSecurity的什么地方和存在内存里的比较?我用的方法是前置一个过滤器,插入到表单验证之前。 比较之后应该怎么处理,:比较之后要抛出一个继...

React基础—父子组件通信_react父子组件通信_梦否的博客-程序员宝宝

1. 父子组件通信在上一小节《React基础—PropTypes类型检查》中已经定义了父、子组件,接下来的工作就将在这个案例上做拓展。比如这里为列表右侧添加一个删除按钮,然后点击后删除本项条目。根据组件化的思想,且还未涉及到其余的父子控件传递数据(通信)的方式,这里就需要使用传递回调函数的方式来处理,也就是:在父控件中定义回调函数方法,然后通过props传递这个函数到子控件中;由子控件触发具体的事件函数,然后调用父控件传递的回调函数,通过参数传递本条数据的标识;比如下面的代码:// 子组件

行内元素、行内块元素、块级元素的区别,空元素有哪些_Start_again_yan的博客-程序员宝宝

行内元素:行内元素也叫内联元素或内嵌元素,只能容纳文本或其他内联元素。常见行内元素有:<a>、<span>、<b>、<strong>、<i>、<em>、<s>、<del>、<u>、<ins>等。特点如下:不独占一行,不自动换行 不能设置宽高属性(可以设置line-height指定高度,宽度随内容变化) margin水平方向有效,垂直方向无效 padding水平方向有效,垂直方

《计算机网络》求职面试题汇总_福小白的博客-程序员宝宝

《计算机网络》求职面试题汇总1. TCP三次握手,四次挥手过程:第一次握手:建立连接时,客户端发送syn包(syn=x)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers);第二次握手:服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ac

Tomcat 中的 NIO 源码分析_mhHao的博客-程序员宝宝

之前写了两篇关于 NIO 的文章,第一篇介绍了 NIO 的 Channel、Buffer、Selector 使用,第二篇介绍了非阻塞 IO 和异步 IO,并展示了简单的用例。本文将介绍 Tomcat 中的 NIO 使用,使大家对 Java NIO 的生产使用有更加直观的认识。虽然本文的源码篇幅也不短,但是 Tomcat 的源码毕竟不像 Doug Lea 的并发源码那么“变态”,对于大部分读者来...

Windows下的Anaconda安装Websocket-Client_SleepingBug的博客-程序员宝宝

很简单,使用命令窗口的方式,进入Anaconda安装目录下的Scripts目录,比如:D:\Anaconda\Scripts,输入:pip install websocket-client即可自动下载安装。其他通过 IPython 运行setup.py文件,或者用pip安装其他模块,也是进入这里来执行都可以的。如果经常安装东西,就把这个路径添加到环境变量吧。...

推荐文章

热门文章

相关标签