- C编程教程
- C语言 - 首页
- C语言基础
- C语言 - 概述
- C语言 - 特性
- C语言 - 历史
- C语言 - 环境搭建
- C语言 - 程序结构
- C语言 - Hello World
- C语言 - 编译过程
- C语言 - 注释
- C语言 - 词法单元
- C语言 - 关键字
- C语言 - 标识符
- C语言 - 用户输入
- C语言 - 基本语法
- C语言 - 数据类型
- C语言 - 变量
- C语言 - 整数提升
- C语言 - 类型转换
- C语言 - 类型强制转换
- C语言 - 布尔值
- C语言中的常量和字面量
- C语言 - 常量
- C语言 - 字面量
- C语言 - 转义序列
- C语言 - 格式说明符
- C语言中的运算符
- C语言 - 运算符
- C语言 - 算术运算符
- C语言 - 关系运算符
- C语言 - 逻辑运算符
- C语言 - 位运算符
- C语言 - 赋值运算符
- C语言 - 一元运算符
- C语言 - 自增和自减运算符
- C语言 - 三元运算符
- C语言 - sizeof运算符
- C语言 - 运算符优先级
- C语言 - 其他运算符
- C语言中的决策机制
- C语言 - 决策机制
- C语言 - if语句
- C语言 - if...else语句
- C语言 - 嵌套if语句
- C语言 - switch语句
- C语言 - 嵌套switch语句
- C语言中的循环
- C语言 - 循环
- C语言 - while循环
- C语言 - for循环
- C语言 - do...while循环
- C语言 - 嵌套循环
- C语言 - 无限循环
- C语言 - break语句
- C语言 - continue语句
- C语言 - goto语句
- C语言中的函数
- C语言 - 函数
- C语言 - main函数
- C语言 - 按值调用函数
- C语言 - 按引用调用函数
- C语言 - 嵌套函数
- C语言 - 可变参数函数
- C语言 - 用户自定义函数
- C语言 - 回调函数
- C语言 - return语句
- C语言 - 递归
- C语言中的作用域规则
- C语言 - 作用域规则
- C语言 - 静态变量
- C语言 - 全局变量
- C语言中的数组
- C语言 - 数组
- C语言 - 数组的特性
- C语言 - 多维数组
- C语言 - 将数组传递给函数
- C语言 - 从函数返回数组
- C语言 - 可变长数组
- C语言中的指针
- C语言 - 指针
- C语言 - 指针和数组
- C语言 - 指针的应用
- C语言 - 指针运算
- C语言 - 指针数组
- C语言 - 指向指针的指针
- C语言 - 将指针传递给函数
- C语言 - 从函数返回指针
- C语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组
- C语言 - 字符指针和函数
- C语言 - 空指针
- C语言 - void指针
- C语言 - 悬空指针
- C语言 - 解引用指针
- C语言 - 近、远和巨型指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点(.)运算符
- C语言 - 枚举(enum)
- C语言 - 结构体填充和打包
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - typedef
- C语言中的文件处理
- C语言 - 输入输出
- C语言 - 文件I/O (文件处理)
- C预处理器
- C语言 - 预处理器
- C语言 - 编译指令
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类别
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C编程资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
C语言头文件
`#include` 预处理指令 用于将一个文件(通常称为头文件)中函数、常量和宏等的定义提供给另一个 C 代码使用。头文件扩展名为“.h”,您可以从中包含一个或多个预定义函数、常量、宏等的声明。C语言中提供头文件有助于程序的模块化设计。
系统头文件
C编译器软件包含许多预编译的头文件。这些称为系统头文件。“stdio.h”就是一个众所周知的例子——几乎每个C程序都会包含的头文件。
每个系统头文件都包含许多实用函数。这些函数通常称为库函数。例如,用于执行I/O操作的printf()和scanf()函数就是“stdio.h”头文件中提供的库函数。
加载一个或多个头文件的预处理器语句总是在C代码的开头。我们从学习C编程的基本“Hello World”程序开始,它首先包含“stdio.h”文件 −
#include <stdio.h> int main() { /* my first program in C */ printf("Hello, World! \n"); return 0; }
C预处理指令`#include`基本上是向编译器发出请求,加载特定头文件的内容,以便在程序中使用它们。
C或C++程序中通常的做法是,我们将所有常量、宏、系统范围的全局变量和函数原型放在头文件中,并在需要的地方包含该头文件。
在C语言中包含头文件的语法
头文件是用`#include` 指令加载的。它的用法遵循以下两种方法之一:
#include <filename.h>
如果头文件在系统/默认目录中可用,则将其名称放在尖括号内。
#include "filename.h"
对于在与源文件相同的目录中可用的用户定义或非标准头文件,将其名称放在双引号内。
`#include`指令的工作原理是指示C预处理器在继续处理当前源文件的其余部分之前,先扫描指定的文件作为输入。预处理器的输出包含已生成的输出,后跟包含文件生成的输出,最后是`#include`指令之后文本生成的输出。
C语言中的标准头文件
一个典型的C编译器包含许多预编译的头文件。每个头文件都包含一组预定义的标准库函数。“#include”预处理指令用于在程序中包含扩展名为“.h”的头文件。
下表显示了一些C语言头文件:
头文件 | 描述 | 函数/宏/变量 |
---|---|---|
stdio.h | 输入/输出函数 | scanf(), printf(), fopen(), FILE |
stdlib.h | 通用实用函数 | atoi(), atof(), malloc() |
math.h | 数学函数 | sin(), cos(), pow(), sqrt() |
string.h | 字符串函数 | strcpy(), strlen(), strcat() |
ctype.h | 字符处理函数 | isalpha(), isupper(), ispunct() |
time.h | 日期和时间函数 | asctime(), gmtime(), mktime() |
float.h | 浮点类型的限制 | FLT_ROUNDS, FLT_RADIX, |
limits.h | 基本类型的尺寸 | CHAR_BIT, CHAR_MIN, CHAR_MAX |
wctype.h | 确定宽字符数据中包含的类型的函数。 | iswalpha(), iswctype(),iswupper() |
示例
以下代码使用了来自一些头文件的几个库函数:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int main() { char s1[20] = "53875"; char s2[10] = "Hello"; char s3[10] = "World"; int res; res = pow(8, 4); printf("Using math.h, The value is : %d\n", res); long int a = atol(s1); printf("Using stdlib.h, the string to long int: %d\n", a); strcpy(s2, s3); printf("Using string.h, the strings s2 and s3: %s\t%s\n", s2, s3); return 0; }
输出
运行此代码时,将产生以下输出:
Using math.h, The value is: 4096 Using stdlib.h, the string to long int: 53875 Using string.h, the strings s2 and s3: World World
用户自定义头文件
我们可以在C程序中添加一个或多个用户自定义函数(除了main()函数)。但是,如果代码包含大量函数定义,将它们放在一个扩展名为“.c”的单个源代码文件中将难以处理和维护。因此,将性质相似的函数/宏/变量组合在一起放在头文件中,就像包含标准头文件一样包含它们,并调用其中定义的函数。
用户定义的头文件通常放在包含C源代码的同一目录中。
下面介绍了使用CodeBlocks IDE创建和使用头文件的步骤。启动CodeBlocks IDE并创建一个新的控制台应用程序:
为项目选择一个合适的名称。在文件夹中添加一个新的空文件,并将以下代码保存为“myheader.h”:
#ifndef MYHEADER_H #define MYHEADER_H void sayHello(); int add(int a, int b); double area(double radius); int length(char *x); #endif
如果一个头文件恰好被包含两次,编译器将处理其内容两次,这将导致错误。防止这种情况的标准方法是使用`#ifndef`指令将文件的全部实际内容括在条件定义中,这称为头文件保护。
头文件保护检查头文件是否已定义。如果未定义,则意味着该文件是第一次被包含,并且将处理保护内的代码。
头文件包含要包含的函数的声明或原型。这些函数的实际定义在一个“.c”文件中提供,其名称与头文件相同。
创建头文件
将以下代码保存到“myheader.c”文件中:
#include <stdio.h> #include <string.h> #include <math.h> #define PI 3.142 void sayHello(){ printf("Hello World\n"); } int add(int a, int b){ int result; result = a+b; return result; } double area(double radius){ double areaofcircle = PI*pow(radius, 2); return areaofcircle; } int length(char *x){ return strlen(x); }
使用头文件
现在,我们可以在程序中包含“myheader.h”文件并调用上述任何函数。将以下代码保存为项目文件夹中的“main.c”。
#include <stdio.h> #include "myheader.h" int main() { int p = 10, q = 20; double x = 5.25; sayHello(); printf("sum of %d and %d is %d\n", p, q, add(p,q)); printf("Radius: %lf Area: %lf", x, area(x)); return 0; }
构建项目并运行“main.c”,可以通过CodeBlocks IDE的运行菜单或命令行获得以下结果:
Hello World sum of 10 and 20 is 30 Radius: 5.250000 Area: 86.601375
计算包含
有时需要选择要包含到程序中的几个不同的头文件之一。例如,它们可能指定要在不同类型的操作系统上使用的配置参数。您可以使用一系列条件语句来做到这一点:
#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 可以通过 Makefile 的 -D 选项来定义。