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并创建一个新的控制台应用程序:

Header Files

为项目选择一个合适的名称。在文件夹中添加一个新的空文件,并将以下代码保存为“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 选项来定义。

广告