[C] 如何使用头文件 .h 编译 C 源码
在 C 语言中,头文件或包含文件通常是一个源代码文件,程序员使用编译器指令将头文件包含进其他源文件的开始(或头部),由编译器在处理另一个源文件时自动包含进来。
一个头文件一般包含类、子程序、变量和其他标识符的前置声明。需要在一个以上源文件中被声明的标识符可以放在一个头文件中,使用时在其他源文件中包含该头文件。
头文件作为模块的公共接口,在其中声明函数原型、对象和数据类型。
让我们首先创建一个头文件 add.h:
#ifndef _ADD_H_
#define _ADD_H_ int add(int, int); #endif
其中 #ifndef, #define, #endif 是编译器指令,为了防止重复包含头文件,最好将所有声明置于 #ifndef ... #endif 区块中。_ADD_H_ 是头文件标识符,为了保持唯一性,一般为头文件名大写,并将其中的句号替换为下划线,同时前后各加一条下划线。
然后让我们再创建一个源文件 add.c 来实现 add.h 中声明的函数原型:
#include "add.h" int add(int a, int b)
{
return a + b;
}
至此我们就准备好了一个源码文件 add.c 和一个头文件 add.h,现在你可以在其他 .c 文件中包含头文件 add.h,然后将它链接到 add.c 的链接文件。
现在我们创建一个文件 triple.c,并在其中包含 add.h 头文件:
#include <stdio.h>
#include "add.h" int triple(int x){
return add(x, add(x, x));
} void main() {
int x;
scanf("%d", &x);
printf("x=%d\n", triple(x));
}
接下来就是使用 gcc 编译它们,首先编译 .c 源文件为 .o 链接文件:
$ gcc -c triple.c -o triple.o
$ gcc -c add.c -o add.o
我们得到两个链接文件 triple.o, add.o。现在让我们将它们链接成可执行文件:
$ gcc triple.o add.o -o triple
让我们测试一下可执行文件 triple:
$ ./triple x=
总结:头文件是在预编译阶段使用,在预编译时编译器会使用头文件中的内容替换 #include 命令。
[C] 如何使用头文件 .h 编译 C 源码的更多相关文章
- [转]extern与头文件(*.h)的区别和联系
用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include<xxx.h> (xxx. ...
- C++头文件预编译与命名空间使用方法
宏指令的预编译用法,用于多文件的头文件预编译判断 头文件代码: #include <iostream> #ifndef XB_H//预编译判断XB_H代码段是否被执行 #define XB ...
- C++中的头文件(.h)和源文件(.cpp)都应该写什么?
头文件(.h):写定义和声明写类的声明(包括类里面的成员和方法的声明).函数原型.#define常数等,但是一般来说不写具体的实现.注意: 1.在写头文件的时候需要注意,在开头和结尾处必须按照如下样式 ...
- extern与头文件(*.h)的区别和联系
原文网址为:http://lpy999.blog.163.com/blog/static/117372061201182051413310/ 个人认为有一些道理:所以转过来学习了. 用#include ...
- 浅谈头文件(.h)和源文件(.cpp)的区别
浅谈头文件(.h)和源文件(.cpp)的区别 本人原来在大一写C的时候,都是所有代码写在一个文件里一锅乱煮.经过自己开始写程序之后,发现一个工程只有一定是由多个不同功能.分门别类展开的文件构成的.一锅 ...
- [原]在win上编译 subversion 源码实践Tonyfield的专栏
(百度和网页的作者无关,不对其内容负责。百度快照谨为网络故障时之索引,不代表被搜索网站的即时页面。) [原]在win上编译 subversion 源码实践 2013-6-9阅读400 评论0 (参考 ...
- Ubuntu12.04编译Android4.0.1源码全过程-----附wubi安装ubuntu编译android源码硬盘空间不够的问题解决
昨晚在编译源码,make一段时间之后报错如下: # A fatal error has been detected by the Java Runtime Environment: # # SIGSE ...
- Windows下编译live555源码
Windos下编译live555源码 环境 Win7 64位 + VS2012 步骤 1)源码下载并解压 在官网上下载最新live555源码,并对其进行解压. 2)VS下建立工程项目 新建Win32项 ...
- windows 平台使用 VS2017 编译 libevent 源码
一 依赖库编译 先要将其依赖的库编译好,其中openssl需要编译到libevent中,编译成libevent_openssl.lib库,zlib在新版本中只有示例用到. 1)windows 平台使用 ...
随机推荐
- Python之从numpy.array保存图片
1.用scipy import scipy scipy.misc.imsave('test.jpg', img) 2.用PIL from PIL import Image im = Image.fro ...
- 利用函数或映射进行数据转换 (map)
先来看个数据 df = DataFrame({"food":["bacon", "pulled pork", "bacon&quo ...
- SQLSERVER中统计所有表的记录数
SQLSERVER中统计所有表的记录数 利用系统索引表sysindexes中索引ID indid<1的行中的rows列存有该表的行数这一特点. 方法是利用隐藏未公开的系统存储过程sp_MS ...
- (笔记)Linux中的终端、控制台、tty、pty
1>tty(终端设备的统称): tty一词源于teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘阅读和发送信息的东西,后来这东西被键盘与显示器 ...
- 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...
- JDBC查询数据实例
在本教程将演示如何在JDBC应用程序中,查询数据库的一个表中数据记录. 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式中数据库表中查询数据记录. 要执行以下示例, ...
- logbook日志系统
python中替代logging的日志系统. 不过比之前的logging难理解. 先上打印到屏幕上的代码和存到日志文件中的代码: #!/usr/bin/env python3 # -*- coding ...
- Asp.Net MVC :路由器
特性路由 特性路由是对现有路由系统的扩展,提供了一种针对某个具体Controller类型或Action方法的路由注册方式.从而可以对路由规则进行细粒度的设计. 特性路由(Attribute Route ...
- CI框架 -- CLI执行php代码
什么是CLI: CLI (命令行界面)是一种基于文本的和计算机交互的方式. 更多信息, 请查看 维基百科 . 为什么使用CLI? 虽然不是很明显,但是有很多情况下我们需要使用命令行来运行 CodeIg ...
- Python——hashlib
该模块实现了诸多安全哈希和消息摘要算法的通用接口,包括 FIPS 安全哈希算法: SHA1, SHA224, SHA256, SHA384 和 SHA512 算法(在 FIPS 180-2 中定义), ...