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/C++学院】(23)Mysql数据库编程--C语言编程实现mysql客户端
- 【C/C++学院】(22)Mysql数据库编程--C语言操作数据库
- C语言错误之--初始值(低级错误)
- C语言编程的环境以及架构
- C语言编程中pid, tid以及真实pid的关系(转)
- 链表详解(C语言)
- C语言/C++常见习题问答集锦(五十六) 之编程实现查找优异生的功能
- C语言/C++常见习题问答集锦(二十六)
- ZZNUOJ_C语言1066:字符分类统计(完整代码)
- ZZNUOJ_用C语言编写程序实现1200:数组的距离(附完整源码)
- ZZNUOJ_用C语言编写程序实现1224:画表格(附完整源码)
- ZZNUOJ_用C语言编写程序实现1248:排列对称串(附完整源码)
- C语言编程入门——程序练习(下)
- [手游项目2]-14-linux下如何用C语言编程判断某端口是否被占用
- C语言之链表简单操作(亲测可用)
- C语言 编程练习22题
- 【精通C语言】extern char k[] != extern char *k
- C语言 前++ 和 后++
- 开发成长之路(2)-- C语言从入门到开发(讲明白指针和引用,顺带讲解多文件编程)
- 初学编程C语言常见问题——【持续更新中】