IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言编程中关于头文件使用问题 -> 正文阅读

[C++知识库]C语言编程中关于头文件使用问题

1 头文件引用方式

文件包含是C预处理程序的另一个重要功能,文件包含命令行的一般有如下两种形式。

#include <stdio.h>
#include "main.h"
  • 使用双引号:系统首先到当前目录下查找被包含的文件,如果没有找到,则到系统指定的“包含文件目录”(由用户在配置环境时设置)中去查找。
  • 使用尖括号:直接到系统指定的“包含文件目录”中去查找。一般的说,使用双引号比较安全。

2 头文件书写格式

2.1 条件编译

首先我们先了解一下什么是条件编译。
在编译程序的时候,为了实现控制哪些代码代码可以参与编译,那些代码不能参与编译,C语言特意引入了条件编译指令。

2.1.1 #ifdef… #else… #endif命令

此领命类似于C语言中的if else 语句,是一种典型的条件编译指令,其语法格式如下。。

#ifdef 常量表达式
	代码段1
#else
	代码段2
#endif

其中,“常量表达式”可以仅为一个编译标志。
如果常量表达式通过#define 方式定义过,则编译“代码段1”,否则编译“代码段2”。

2.1.2 #if defined… #else… #endif命令

同2.1.1

2.1.3 #ifndef… #else… #endif命令

一般格式如下。

#ifndef 常量表达式
	代码段1
#else
	代码段2
#endif

如果常量表达式没有通过#define 方式定义过,则编译“代码段1”,否则编译“代码段2”。

2.1.4 #if !defined… #else… #endif命令

同2.1.3

2.1.5 #ifdef… #elif… #else #endif命令

次此条件编译命令为分支条件编译指令。

#ifndef 常量表达式1
	代码段1
#elif 常量表达式2
	代码段2
#else
	代码段3
#endif

在使用#define 定义常量表达式时,无论定义格式为 以下哪两种,编译器都有可能认为常量表达式为真。因此在定义常量表达式时,为了不产生歧义。如果想让常量表达式定义为真,就将常量表达式的值定义为非零值,如果想让常量表达式的值为假,就不要定义常量表达式。

#define OK 0   //可能为真,可能为假
#define YES 1  //必为真

2.2 头文件创建

2.2.1 头文件书写格式

在单片机程序中,我们一般使用如下的格式编写头文件。

#ifndef __LED_H
#define __LED_H

#include "stm32f4xx.h"
void LED_Init(void);//初始化
		 				    
#endif

此处,便使用了2.1.3节的语法格式。

2.2.2 代码分析

#ifndef是起到了一个防止一个源文件多次包含同一个头文件。
当第一次包含这个头文件时,由于没有宏定义#define __LED_H此时 #ifndef __LED_H 的条件为真,执行#ifndef__LED_H 和 #endif所包含的代码,此时也会执行宏定义#define __LED_H。
当第二次包含该头文件时,由于上次已经定义了#define __LED_H,此时 #ifndef __LED_H 的条件为假,便不会再执行头文件中的内容。
如果没有这种宏定义,当头文件中定义了一个名称为data变量,那么当多次包含这个头文件时,程序就会因为重复定义data变量而报错。

3 头文件路径

通过本文1节中介绍可知,头文件一般会去当前目录下或者用户配置的环境中去寻找头文件。
因此当头文件不在这两个范围中时,我们必须将头文件引导至这两种查找方式中,才可以正确包含头文件。

3.1 Keil环境配置

在使用keil编写单片机程序时,我们都会自己写一些头文件,然后让C文件引用这些头文件,引用前,需要我们对程序进行头文件路径的配置,将头文件的路径包含到程序中。路径包含后,程序中的C文件才可以找到对应的头文件。配置界面如下图所示。
在这里插入图片描述

3.2 头文件相对路径引用

除了在程序软件中包含头文件的路径,我们还可以通过相对路径的写法,包含相对路径下的头文件。

3.2.1 同目录下的头文件引用

如果C文件和头文件处于同一路径下,那么可以直接引用该头文件。

3.2.2 不同目录下头文件引用

如果头文件和C文件在不同的路径下,那么,需要通过相对路径的方式,找到文件的位置。

例子:

  • C文件路径: C:\Users\Desktop\STM32F4xx\USER\main.c
  • 头文件路径:C:\Users\Desktop\STM32F4xx\HARDWARE\LED\led.h

当main.c文件想要引用头文件led.h时,需要先退出USER文件,到STM32F4xx文件夹中,在找到HARDWARE下的LED文件中去,引用led.h。
因此在包含此头文件时可以采用一下写法。

#include "..\HARDWARE\LED\led.h" 

其中..\ 表示退出到上一级文件夹中,然后按照Windows路径写法向下找到 led.h这个头文件。

3.2.3 相对路径引用的建议

虽然使用相对路径引用头文件的方式,免去了配置程序头文件路径的步骤,但是在程序编写时,软件仍会给出报错的提示,提示“fatal error :‘xxx.h’ file not found”.此提示虽然不会影响编译和组建工程报错。当程序最终编写完成后,最好还是将头文件的路径包含到程序工程中。消除此提示。

参考网络资源:
【1】#ifndef详解 - 百度文库
【2】使用头文件(相对路径)、命名头文件、命名空间_shyboyandgirl的博客-CSDN博客_头文件命名规则

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-10 11:40:56  更:2022-05-10 11:41:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 23:37:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码