C 语言头文件

C 语言头文件

头文件是扩展名为 .h 的文件,包含了 C 函数声明和宏定义,被多个源文件中引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。

在程序中要使用头文件,需要使用 C 预处理指令 #include 来引用它。前面我们已经看过 stdio.h 头文件,它是编译器自带的头文件。

引用头文件相当于复制头文件的内容,但是我们不会直接在源文件中复制头文件的内容,因为这么做很容易出错,特别在程序是由多个源文件组成的时候。

A simple practice in C 或 C++ 程序中,建议把所有的常量、宏、系统全局变量和函数原型写在头文件中,在需要的时候随时引用这些头文件。

引用头文件的语法

使用预处理指令 #include 可以引用用户和系统头文件。它的形式有以下两种:

#include <file>

这种形式用于引用系统头文件。它在系统目录的标准列表中搜索名为 file 的文件。在编译源代码时,您可以通过 -I 选项把目录前置在该列表前。

#include "file"

这种形式用于引用用户头文件。它在包含当前文件的目录中搜索名为 file 的文件。在编译源代码时,您可以通过 -I 选项把目录前置在该列表前。

引用头文件的操作

#include 指令会指示 C 预处理器浏览指定的文件作为输入。预处理器的输出包含了已经生成的输出,被引用文件生成的输出以及 #include 指令之后的文本输出。例如,如果您有一个头文件 header.h,如下:

char *test (void);

和一个使用了头文件的主程序 program.c,如下:

int x;
#include "header.h"
int main (void)
{puts (test ());
}

编译器会看到如下的代码信息:

int x;
char *test (void);
int main (void)
{puts (test ());
}

只引用一次头文件

如果一个头文件被引用两次,编译器会处理两次头文件的内容,这将产生错误。为了防止这种情况,标准的做法是把文件的整个内容放在条件编译语句中,如下:

#ifndef HEADER_FILE
#define HEADER_FILE
the entire header file file
#endif

这种结构就是通常所说的包装器 #ifndef。当再次引用头文件时,条件为假,因为 HEADER_FILE 已定义。此时,预处理器会跳过文件的整个内容,编译器会忽略它。

有条件引用

有时需要从多个不同的头文件中选择一个引用到程序中。例如,需要指定在不同的操作系统上使用的配置参数。您可以通过一系列条件来实现这点,如下:

#if SYSTEM_1# include "system_1.h"
#elif SYSTEM_2# include "system_2.h"
#elif SYSTEM_3...
#endif

但是如果头文件比较多的时候,这么做是很不妥当的,预处理器使用宏来定义头文件的名称。这就是所谓的有条件引用。它不是用头文件的名称作为 #include 的直接参数,您只需要使用宏名称代替即可:

 #define SYSTEM_H "system_1.h"...#include SYSTEM_H

SYSTEM_H 会扩展,预处理器会查找 system_1.h,就像 #include 最初编写的那样。SYSTEM_H 可通过 -D 选项被您的 Makefile 定义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/177274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两部手机数据传输后备忘录不见了怎么回事

想必很多人都遇到过&#xff0c;当两部手机进行备忘录数据传输后&#xff0c;突然发现备忘录不见了&#xff0c;这让人不禁着急上火&#xff0c;我也曾经遇到过这种事情导致很多重要的内容都丢失了。 一般出现这种情况可能是因为&#xff0c;两部手机使用的是不同的云服务&…

中学课程辅导杂志中学课程辅导杂志社中学课程辅导编辑部2023年第10期目录

教育视点 核心素养导向下的初中化学大单元教学研究 陈玉霞; 3-5 核心素养下的英语大单元教学策略 马玲凤; 6-8 盲校初中语文课堂教学特点及教学策略 王瀚文;王彩云; 9-11 新课改背景下高中语文教学语言的运用探讨 王文静; 12-14《中学课程辅导》投稿&#xff1…

第二十章,多线程

创建线程 有两种方式&#xff0c;分别为继承Java.lang.Thread类与实现Java.lang.Runnable接口 继承Thread类 Thread常用的两个构造方法语法 public Thread&#xff08;&#xff09;&#xff1b; public Thread&#xff08;String threadName&#xff09;&#xff1b; 继承…

NOI / 1.10编程基础之简单排序 提问01:谁考了第k名 c语言 结构体

描述 在一次考试中&#xff0c;每个学生的成绩都不相同&#xff0c;现知道了每个学生的学号和成绩&#xff0c;求考第k名学生的学号和成绩。 输入 第一行有两个整数&#xff0c;分别是学生的人数n&#xff08;1≤n≤100&#xff09;&#xff0c;和求第k名学生的k&#xff08…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 5》(9)

《Linux操作系统原理分析之Linux 进程管理 5》&#xff08;9&#xff09; 4 Linux 进程管理4.5 Linux 信号4.5.1 信号的作用和种类1.信号机制2.信号种类 4.5.2 信号的处理4.5.3 信号处理函数1&#xff0e;数据结构2&#xff0e; 处理函数 signal3&#xff0e;程序例 4 Linux 进…

论文阅读:“Appearance Capture and Modeling of Human Teeth”

文章目录 AbstractIntroductionMethod OverviewTeeth Appearance ModelEnamelDentinGingiva and oral cavity Data AcquisitionImage captureGeometry capture ResultsReferences Abstract 如果要为电影&#xff0c;游戏或其他类型的项目创建在虚拟环境中显示的人类角色&#…

原生js和jQuery的区别

1. 原生JavaScript是一种基于ECMAScript规范的编程语言&#xff0c;而jQuery是基于JavaScript的一个库&#xff0c;它提供了一种更简洁、易用的语法来操作HTML文档、处理事件、执行动画等。 2. 原生JavaScript没有依赖任何外部库&#xff0c;而jQuery依赖于jQuery库。这意味着…

【RTP】4: 实例解析:一个SRTP的wireshark抓包:带padding、带扩展

抓取的是视频包。固定的pt是127从头部找到序号,快速找到这个包包大小因为是包括了SRTP的,所以318 个字节,实际RTP包是286个字节。SRTP 包 UDP总共 294个字节,payload部分286 RTP协议 RTP部分: B0 代表有padding、有扩展 从B0开始

Kylin操作系统安装mysql8,Neginx相关问题记录

文章目录 一、Linux常见命令记录1. 为普通用户赋sudo权限2. Kylin系统yum配置以及使用2.1 Kylin操作系统yum源配置(本地yum源)2.1.1 .repo类型文件存在2.1.2 .repo类型文件不存在2.1.3 挂载OS镜像文件2.1.4 编辑local.repo文件&#xff0c;创建yum源地址2.1.5使yum源生效 2.2 y…

Android 如何让路由器或者其他AP设备获取到主机名

问题原因: 连接到AP设备后,发现主机名在路由器或者其他AP设备都无法正常显示 抓取tcpdump log发现DHCP request option中没有携带host name(Option 12)字段 如下图所示 修改方法: 将config_dhcp_client_hostname配置true后,可以看到host name了 具体代码逻辑如下 pack…

Linux网络——数据链路层

目录 一.认识以太网 二.以太网帧格式 三.认识MAC地址 四.认识MTU 五.以太局域网的通信原理 六.其他重要协议 1.DNS协议 2.域名简介 3.ICMP协议 4.NAT技术 5.NAT技术的缺陷 6.NAT和代理服务器 一.认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标…

浅谈基于EIoT能源物联网的工厂智能照明系统应用改造

【摘要】&#xff1a;随着物联网技术的发展&#xff0c;许多场所针对照明合理应用物联网照明系统&#xff0c;照明作为工厂的重要能耗之一&#xff0c;工厂的照明智能化控制&#xff0c;如何优化控制、提高能源的利用率&#xff0c;达到节约能源的目的。将互联网的技术应用到工…

【C语言】Debian10使用zlib库crc32()函数

crc32函数原型 uint32_t crc32(uint32_t crc, const Bytef *buf, uInt len); 参数说明 crc&#xff1a;初始的CRC值或者之前计算得到的CRC值。在初次调用时&#xff0c;通常使用0xFFFFFFFF作为初始值。buf&#xff1a;指向数据缓冲区的指针&#xff0c;包含需要计算CRC的数据…

Python字典合并

合并两个有部分key相同的字典&#xff0c;相同key保留两个字典中对应key的较大值。 (笔记模板由python脚本于2023年11月27日 18:12:15创建&#xff0c;本篇笔记适合熟悉Python字典的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Fr…

笔记十九*、选中高亮和嵌套路由使用

19.1 选中高亮 NavLink App.jsx import React from "react"; import {NavLink, useRoutes} from "react-router-dom"; import routes from "./routes/index.jsx"; import "./app.css"const App () > {const element useRoutes(…

Kotlin(十二) 定义静态方法

静态方法在某些编程语言里面又叫作类方法&#xff0c;指的就是那种不需要创建实例就能调用的方法&#xff0c;所有主流的编程语言都会支持静态方法这个特性。 在Java中定义一个静态方法非常简单&#xff0c;只需要在方法上声明一个static关键字就可以了&#xff0c;如下所示&a…

SQL注入-HTTP头注入

目录 HTTP Header概述 HTTP Header注入 HTTP Header注入概述 HTTP Header注入实例 HTTP Header概述 HTTP工作原理 HTTP请求方法 HTTP报文类型 请求报文&#xff08;HTTP Request&#xff09;&#xff1a;由客户端发给服务器的消息&#xff0c;其组成包括请求行&#xff08;R…

系统与软件安全研究(九)

A Taxonomy of C Decompiler Fidelity Issues Usenix security 2024 Carnegie Mellon University Intro 反编译是分析编译程序并恢复表现相同行为的源代码程序的过程,是计算机安全领域中的关键工具。它使安全从业者能够更快速地深入了解编译程序的行为,尤其在分析恶意软件和…

我用C语言实现的文字跑马灯,简直是程序员的表白神器!

系列文章 Python百宝箱 C语言百宝箱 目录 系列文章 写在前面 C语言简介 EasyX简介 EasyX下载安装 文字跑马灯 写在后面 写在前面 教你用C语言实现文字跑马灯效果&#xff0c;简直是C语言表白神器&#xff01; 环境&#xff1a;C语言/C 软件&#xff1a;Visual Studi…

中科大蒋彬课题组开发 FIREANN,分析原子对外界场的响应

内容一览&#xff1a; 使用传统方法分析化学系统与外场的相互作用&#xff0c;具有效率低、成本高等劣势。中国科学技术大学的蒋彬课题组&#xff0c;在原子环境的描述中引入了场相关特征&#xff0c;开发了 FIREANN&#xff0c;借助机器学习对系统的场相关性进行了很好的描述。…