C学习-头文件
#灵感# 工作中接触的代码,很庞大。现在拆分一下,逐步学习
目录
(1).h 文件里写的什么
#define 宏定义
只有宏名:
#if
#ifdef #ifndef
#include
(1).h 文件里写的什么
经常用在文件头部的被包含的文件称为“标题文件”或“头部文件”,一般以.h为后缀,如fl.h。
一般情况下将如下内容放到h文件中:
- 宏定义。 #define D Double
- 结构、联合和枚举声明。(struct、enum)
- typedef 声明。 typedef char char8;
- 外部函数声明。 void Log_Set_Simple_Mode(BOOL isSample);
- 全局变量声明。
使用文件包含为实现程序修改提供了方便,当需要修改一些参数时不必修改每个程序,只需修改
(2).h 文件标准格式
#define 宏定义
宏定义指令#define 用来定义一个标识符和一个字符串,以这个标识符来代表这个字符串,在程序中每次遇到该标识符时就用所定义的字符串替换它。
宏定义的作用相当于给指定的字符串起一个别名。
不带参数的宏定义一般形式如下:
#define 宏名 字符串区
# 表示这是一条预处理命令。
宏名是一个标识符,必须符合C语言标识符的规定。
字符串这里可以是常数、表达式、格式字符串等。
例如:
#define Pl 3.14159
该语句的作用是在该程序中用 PI 替代3.14159,在编译预处理时,每当在源程序中遇到PI 就自动
用3.14159代替。
使用#define 进行宏定义的好处是需要改变一个常量时只需改变#define 命令行,整个程序的常量都
会改变,大大提高了程序的灵活性。
宏名要简单且意义明确,一般习惯用大写字母表示以便与变量名相区别。
只有宏名:
这种用法通常用于编译时的配置,例如头文件管理。通过定义一个宏名,可以在包含头文件时进行条件编译,避免头文件被重复包含。例如:
#ifndef _XXX_H_
#define _XXX_H_
// 内容
#endif
这种方式可以确保头文件只被包含一次,即使多次包含同一个头文件,也只会处理一次。
#if
#if的基本含义是:如果#if命令后的参数表达式为真,则编译#if到#endif 之间的程序段,否则跳
过这段程序。 #endif 命令用来表示#if段的结束。
#if命令的一般形式如下:
#if 常数表达式
语句段
#endif
#ifdef #ifndef
#ifdef 与#ifndef 命令,分别表示“如果有定义”及“如果无定义”。下面就对这两个命令进行介绍。
#ifdef 的一般形式如下:
#ifdef 宏替换名
语句段
#endif
其含义是:如果宏替换名已被定义过,则对“语句段”进行编译;如果未定义,则不对语句段进行编译。
#ifdef 可与#else 连用,构成的一般形式如下:
#ifdef 宏替换名
语句段 1
#else
语句段 2
#endif
其含义是:如果宏替换名已被定义过,则对“语句段1”进行编译;如果未定义#ifdef 后面的宏替
换名,则对“语句段2”进行编译。
#ifndef 的一般形式如下:
#ifndef 宏替换名
语句段
#endif
其含义是:如果未定义#ifndef 后面的宏替换名,则对“语句段”进行编译:如果定义#ifndef 后面
的宏替换名,则不执行语句段。
同样,#ifndef 也可以与#else 连用.
#include
一个源文件中使用#include 指令可以将另一个源文件的全部内容包含进来,也就是将另外的文件包含到本文件之中。
#include 使编译程序将另一源文件a 嵌入----> 带有#include 的源文件b中。被读入的源文件a必须用双引号或尖括号括起来。例如:
#include "stdio.h"
#include <stdio.h>
这两行代码均使用C编译程序读入并编译,用于处理磁盘文件库的子程序。
上面给出了双引号和尖括号的形式,这两者之间的区别是,用尖括号时,系统到存放C 库函数头文件所在的目录中寻找要包含的文件,这为标准方式;用双引号时,系统先在用户当前目录中寻找要包含的文件,若找不到,再到存放C库函数头文件所在的目录中寻找要包含的文件。
通常情况下,如果为调用库函数用#include 命令来包含相关的头文件,则用尖括号可以节省查找的时间。如果要包含的是用户自己编写的文件,一般用双引号,用户自己编写的文件通常是在当前目录中。如果文件不在当前目录中,双引号可给出文件路径。