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_FILEthe 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/809506.shtml

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

相关文章

基于一阶微分的图像增强-梯度法(不丢弃任何像素变化--信息的提取作用)

首先我大致说一下前一小节的内容&#xff1a;反锐化掩模与高提升滤波处理 图像的锐化方法&#xff0c;其实有很多。锐化的定义提升突变像素的灰度级&#xff0c;减少变化缓慢像素的灰度级。 为什么可以利用模糊图像来进行锐化呢&#xff1f;因为模糊图像的模糊位置通常都是原…

第十二篇-jQuery理论

jQuery定义 jQuery是一个快速、简洁的JavaScript库&#xff0c;它能够简化HTML文档遍历、事件处理、动画设计和Ajax交互。jQuery的设计目标是通过尽可能少的代码实现更多的功能&#xff0c;并且提供一种优雅的方式来处理HTML文档、处理事件、创建动画效果以及实现Ajax交互。. …

《前端防坑》- JS基础 - 你觉得Boolean(‘false‘) === false吗?

问题 你觉得Boolean(false) false吗&#xff0c; Boolean([]) false吗&#xff1f; 答案 Boolean(false) true, Boolean([]) true 验证 原因 Boolean 对象表示两个值&#xff1a;"true" 或 "false" 但是能使Boolean为flase的只有6种情况&#xff…

科技的成就(五十八)

543、神经网络应用于机器翻译 2003 年 2 月&#xff0c;神经网络开始应用于机器翻译。约书亚本吉奥等发表论文“A Neural Probabilistic Language Model”。他们的研究团队基于神经网络开发出了一个语言模型&#xff0c;改善了统计机器翻译中的问题&#xff0c;这项研究为未来神…

嵌入式单片机入职第二天-EEPROM与IIC

上午&#xff1a; 1.安装Jlink驱动&#xff0c;死活没反应&#xff0c;因为昨天才装完系统&#xff0c;领导让我装电脑主板驱动 领导方法进惠普官网通过查询电脑型号&#xff0c;里面几十个驱动搞得我眼花&#xff0c;领导告诉我进官网就去开会了&#xff0c;可能因为是外网&…

idea如何debug看springsecurity的过滤器顺序

idea如何debug看springsecurity的过滤器顺序 先配置一个Spring启动对象,后续需要根据这个对象来获取SpringSecurity的过滤器链 设置一个输出信息&#xff0c;需要在输出信息这里打上断点&#xff0c;才方便查看过滤器链 public static void main(String[] args) {//此时不…

Qt | 信号与槽 原理、连接、断开(面试无忧)

1、信号和槽是用于对象之间的通信的,这是 Qt 的核心。为此 Qt 引入了一些关键字,他们是slots、signals、emit,这些都不是 C++关键字,是 Qt 特有的,这些关键字会被 Qt 的 moc转换为标准的 C++语句。 2、Qt 的部件类中有一些已经定义好了的信号和槽,通常的作法是子类化部件…

yolov5旋转目标检测遥感图像检测-无人机旋转目标检测(代码和原理)

YOLOv5&#xff08;You Only Look Once version 5&#xff09;是一个流行且高效的实时目标检测深度学习模型&#xff0c;最初设计用于处理图像中的水平矩形边界框目标。然而&#xff0c;对于旋转目标检测&#xff0c;通常需要对原始YOLOv5架构进行扩展或修改&#xff0c;以便能…

达梦数据库安装教程

达梦数据库安装包与常规的数据库安装逻辑一致。 下载安装包 首先&#xff0c;您需要从达梦官方网站下载适用于您的操作系统的达梦数据库安装包&#xff08;这一步要注意区分硬件芯片类型。请注意&#xff0c;选择与您的操作系统和硬件平台相匹配的安装包&#xff0c;以免在安…

ChatGPT之道:发掘AI工具在论文写作中的妙用

ChatGPT无限次数:点击直达 ChatGPT之道&#xff1a;发掘AI工具在论文写作中的妙用 随着人工智能技术的快速发展&#xff0c;ChatGPT作为一款先进的自然语言处理工具&#xff0c;在各个领域展现出了非凡的潜力。本文将探讨ChatGPT在论文写作中的应用&#xff0c;以及如何利用其…

Imagination APXM-6200 CPU:性能卓越,安全可信

随着消费类和工业应用行业的不断发展&#xff0c;对创新性能和效率的需求永不停歇&#xff0c;我们自豪地推出旗下 Catapult CPU 系列的第二款产品&#xff1a;Imagination APXM-6200 CPU 。这款 64 位的高效 RISC-V 应用处理器具有强大的 AI 功能及性能密度&#xff0c;能够为…

阿里云服务器项目部署docker-compose+vue+redis+nginx+minio+springboot

1 阿里云服务器项目部署-单机部署 docker-compose 1.1 搭建背景 服务器 阿里云服务器 前端 vue 后端 springboot 服务 redis 、nginx、minio 都做单机模式部署,不做集群部署 博客内容参考了其他博文&#xff0c;会贴出来 1.2 <重要>端口开放前提说明 任何开放的端…

【迅为iTOP-4412-linux 系统制作(4)】ADB 或者 TF 卡烧写测试

准备工作 编译生成的内核镜像uImage 和设备树 dtb 文件“exynos4412-itop-elite.dtb”已经可以使用了。 把编译生成的uimage和dtb文件。拷贝fastboot工具。官方的u-boot-iTOP-4412.bin 也拷贝到 platform-tools 文件夹目录内。system.img 也拷贝到 platform-tools 文件夹目录…

11 nacos 的 配置获取 和 服务注册

前言 nacos 在微服务体系中有两大个功能, 作为配置中心 和 服务发现 最近碰到了一些 nacos 的相关问题, 整理了一下 这方面的东西 nacos client 的配置读取 这一系列主要是在 NacosManager 这个 bean 的相关业务流程的过程中处理的 NacosManager 初始化的时候, 会向 naco…

iOS 二进制重排

原理&#xff1a;减少page fault次数&#xff0c;将启动用到的代码都放到一个page里。 操作&#xff1a; 统计启动过程中用到的函数。 http://yulingtianxia.com/blog/2019/09/01/App-Order-Files/ Other C flag里加上-fsanitize-coveragefunc,trace-pc-guard&#xff0c;C/C…

力扣HOT100 - 48. 旋转图像

解题思路&#xff1a; 要求原地旋转 可以先上下翻转&#xff0c;再沿主对角线反转&#xff08;左上到右下的对角线&#xff09; class Solution {public void rotate(int[][] matrix) {int n matrix.length;// 上下翻转for (int i 0; i < n / 2; i) {for (int j 0; j &…

软考学习之路-系统集成项目管理工程师-考试要点记录1

软考学习之路-系统集成项目管理工程师-考试要点记录 前言介绍必考知识点1、项目管理五大过程组启动过程组规划规程组执行过程组监控过程组收尾过程组 2、项目整合管理3、项目范围管理4、项目时间管理5、项目成本管理6、项目质量管理7、人力资源管理8、项目沟通管理9、项目风险管…

YOLOv9最新改进系列:YOLOv9融合BoTNet模块,融合CNN+自然语言处理技术的优势,有效提升检测效果!

YOLOv9最新改进系列&#xff1a;YOLOv9融合BoTNet模块&#xff0c;融合CNN自然语言处理技术的优势&#xff0c;有效提升检测效果&#xff01; YOLOv9原文链接戳这里&#xff0c;原文全文翻译请关注B站Ai学术叫叫首er B站全文戳这里&#xff01; 详细的改进教程以及源码&…

LangChain - LLMs

文章目录 一、LLMs vs 聊天模型二、入门1、设置 OpenAI2、__call__: string in -> string out3、generate: batch calls, richer outputs 三、异步 API四、Custom LLM五、Fake LLM六、Human input LLM七、缓存 llm_caching1、内存缓存&#xff08;In Memory Cache&#xff0…

vue简单使用三(class样式绑定)

目录 对象的形式绑定&#xff1a; 数组的形式绑定&#xff1a; 内联样式Style 对象的形式绑定&#xff1a; 可以看到class中有两个值 数组的形式绑定&#xff1a; 可以看到也有两个值 内联样式Style style样式设置成功 完整代码&#xff1a; <!DOCTYPE html> <html…