C语言中的头文件

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

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

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

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

引用头文件的语法

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

#include

    这种形式用于引用系统头文件。它在系统目录的标准列表中搜索名为 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/338837.shtml

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

相关文章

set trans 必须是事务处理的第一个语句_MySQL中特别实用的几种SQL语句送给大家

在写SQL时,经常灵活运用一些SQL语句编写的技巧,可以大大简化程序逻辑。减少程序与数据库的交互次数,有利于数据库高可用性,同时也能显得你的SQL很牛B,让同事们眼前一亮。实用的SQL1.插入或替换如果我们想插入一条新记录…

C语言预处理命令总结

预处理指令是以#号开头的代码行,# 号必须是该行除了任何空白字符外的第一个字符。# 后是指令关键字,在关键字和 # 号之间允许存在任意个数的空白字符,整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转…

突破极限–如何使用AeroGear Unified Push for Java EE和Node.js

在2014年底的AeroGear队宣布红帽的JBoss统一推送服务器的可用性xPaaS 。 让我们仔细看看! 总览 统一推送服务器允许开发人员将本地推送消息发送到Apple的推送通知服务(APNS)和Google的云消息传递(GCM)。 它具有内置的…

mysql 分词搜索_实战 | canal 实现Mysql到Elasticsearch实时增量同步

题记关系型数据库Mysql/Oracle增量同步Elasticsearch是持续关注的问题,也是社区、QQ群等讨论最多的问题之一。 问题包含但不限于: 1、Mysql如何同步到Elasticsearch? 2、Logstash、kafka_connector、canal选型有什么不同,如何取舍&#xff1…

C memset 踩坑

一、前言memset 作为对内存初始化的函数,还是有不少坑和误区的,今天就来对这个函数作一个总结。二、函数作用最简单的调用就是将一个数组清零,代码如下:const int maxn 1024; int a[maxn]; memset(a, 0, sizeof(a)); // a[0]a[1…

eap和psk_针对WildFly和EAP运行Java Mission Control和Flight Recorder

eap和pskJava Mission Control (JMC)使您可以监视和管理Java应用程序,而无需引入通常与这些类型的工具相关的性能开销。 它使用为正常的JVM动态优化而收集的数据,从而形成了一种非常轻量级的方法来观察和分析应用程序代码中的问题…

C语言合法标识符

Problem Description输入一个字符串,判断其是否是C的合法标识符。Input输入数据包含多个测试实例,数据的第一行是一个整数n,表示测试实例的个数,然后是n行输入数据,每行是一个长度不超过50的字符串。Output对于每组输入数据&#…

线程魔术技巧:使用Java线程可以做的5件事

Java线程最鲜为人知的事实和用例是什么? 有些人喜欢爬山,有些人喜欢跳伞。 我,我喜欢Java。 我喜欢它的一件事是,您永不停止学习。 您每天使用的工具通常可以为您带来全新的面貌,以及您还没有机会看到的方法和有趣的用…

java webview框架_java - Android WebView 无法正常显示网页图表

Android客户端中混搭HTML页面,会出现虽然HTML内容载入完成,标题也正常显示,但是整个网页需要等到近5秒(甚至更多)时间才会显示出来。研究了很久,搜遍了国外很多网站,也看过PhoneGap的代码,一直无解。 …

每日干货丨C语言数组知识点总结

一.一维数组1. 初始化方法第一种:完全初始化。依次赋值如:a[5] {2,3,4, 5, 6};a[] {1,2, 3, 4, 5, 6};第二种:不完全初始化。初始化式中的值从a[0]开始,依次向后赋值&a…

C语言指南-数组之谜

前言在C语言中,数组和指针似乎总是“暧昧不清”,有时候很容易把它们混淆。本文就来理一理数组和指针之间到底有哪些异同。数组回顾在分析之前,我们不妨回顾一下数组的知识。数组是可以存储一个固定大小的相同类型元素的顺序集合。为了便于我们…

python生成uuid_咸鱼高赞回答:有什么相见恨晚的Python技巧,附赠python最新教程...

日常工作几乎离不python。一路走来,他积累了不少有用的技巧和tips,现在就将这些技巧分享给大家。这些技巧将根据其首字母按A-Z的顺序进行展示。Python相关学习资料获取方式:转发文章关注私信【Python】ALL OR ANYPython之所以成为这么一门受欢…

java用十字链表实现无向图_实验四:图的实现与应用

20162317袁逸灏 实验四:图的实现与应用实验内容用邻接矩阵十字链表实现无向图中的添加结点删除结点添加边删除边size()isEmpty()广度优先迭代器深度优先迭代器方法实验要求实验1:用邻接矩阵实现无向图(边和顶点都要保存),实现在包含添加和删除…

C语言指针变量的运算

前言指针变量也是可以进行运算的,如指针变量对其自身加上某个整数或减去某个整数,这在内存上体现为:相对这个指针向后偏移多少个单位或向前偏移了多少个单位,这里的单位与指针变量的类型有关。在32bit环境下,int类型占…

关于n对角矩阵数据结构_机器学习与线性代数 - 特殊矩阵

在线性代数中,有一些特殊的矩阵具有易于分析和操作的特性。它们的特征向量可能具有特定的特征值或特殊关系。还有一些方法可以将一个矩阵分解成这些“更简单”的矩阵。操作复杂性的降低提高了可伸缩性。然而,即使这些矩阵都是特殊的,它们也不…

C语言内存/指针相关

内存数据类型–更好的内存管理数据类型:固定大小内存的别名typedef结构体的别名 typedef struct Student MyStudent给指针起别名 typedef char * PCHAR给变量起别名 typedef longlong mylong_t注意:void类型不能typedefvoid只能对函数返回和参数的限定vo…

求杨辉三角的前n行数据_LeetCode算法第118题:杨辉三角

题目描述:给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 5输出:[ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1]]思路:杨辉三角形有如下两个特性每一行的第…

jasmine单元测试_使用Jasmine,Spock和Nashorn测试JVM服务器端JavaScript

jasmine单元测试JavaScript使用不仅限于浏览器中的客户端代码或NodeJS支持的服务器端代码。 许多基于JVM的项目都将其用作内部脚本语言。 测试这种功能既不简单也不标准。 在本文中,我打算演示一种使用成熟的工具(例如Jasmine , Spock和Nasho…

常用于单片机的接口适配器模式C语言实现

一般实现在我们做项目的时候,一般的实现,可能我们会这样写代码// FileName: test.c// 来源:公众号【技术让梦想更伟大】#include#include “ExternModule.h” int main(void){/*初始化*/ vAllInit(); while(1) { /*项目逻辑*/ vLo…

ar面部识别_国内手机厂商AR布局报告

欢迎关注AIRX的B站官方账号:AIRX社区,我们会定期和一些ARVR、AI企业和高校合作直播,分享前沿ARVR、AI、Unity、Unreal技术和教程。招运营、UI设计志愿者进行时,我们期待您的加入~文章来源 :增强现实核心技术…