C 头文件

  • Post category:C

C 头文件使用攻略

什么是C头文件

C 头文件是指包含C语言代码的文本文件,通常以.h为文件后缀名。头文件中通常包含函数原型、宏定义、结构体和枚举定义等。

通过使用头文件,可以将函数或变量的定义与声明分开,方便代码编写和维护,同时也可以方便地将多个文件中重复使用的代码提取出来,使得代码更加模块化和复用性更高。

如何编写C头文件

声明函数和变量

在头文件中,可以声明函数和变量的原型,让其他 C 文件能够使用这些函数和变量而不必了解其具体实现。

例如,在 “myheader.h” 头文件中,声明了一个函数和一个变量,如下所示:

// myheader.h
int myfunction(int a, int b);
extern const int myconstant;

在其他的C文件中,如果想要使用 myfunction 和 myconstant,可以先引入 “myheader.h” 头文件,然后在代码中直接调用函数和访问变量,如下所示:

// main.c
#include "myheader.h"
int main() {
    int result = myfunction(1, 2);
    printf("The result is %d\n", result);
    printf("My constant is %d\n", myconstant);
    return 0;
}

需要注意的是,在头文件中使用 extern 关键字来声明变量是很常见的做法,extern 只是表示该变量是在其他地方定义的全局变量,这里只是声明了一下。

定义宏

在头文件中,可以定义宏,用于对代码中的数据类型、变量名、常量等进行规范的命名。在程序中使用宏定义的名称可以让代码更加清晰、易读、易懂。

例如,可以在头文件中定义一个宏,表示一个常量值:

// myheader.h
#define PI 3.1415926

然后在其他的C文件中,可以直接使用 PI 这个宏:

// main.c
#include "myheader.h"
int main() {
    double r = 10.0;
    double area = PI * r * r;
    printf("The area of the circle is %.2f\n", area);
    return 0;
}

定义结构体和枚举

在头文件中,也可以定义结构体和枚举,定义后可以在整个程序中使用。

例如,在头文件中定义一个表示复数的结构体:

// myheader.h
typedef struct _ComplexNumber {
    double real;
    double imag;
} ComplexNumber;

ComplexNumber c_add(ComplexNumber a, ComplexNumber b);

然后在其他的C文件中,可以直接使用 ComplexNumber 这个结构体:

// main.c
#include "myheader.h"
int main() {
    ComplexNumber a = {1.0, 2.0};
    ComplexNumber b = {3.0, 4.0};
    ComplexNumber c = c_add(a, b);
    printf("The result of adding two complex numbers is %.2f + %.2fi\n", c.real, c.imag);
    return 0;
}

示例说明

下面给出一个更完整的示例,展示了如何定义头文件、编写实现文件和测试文件。

myheader.h

// myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H

// 定义宏
#define ARRAY_SIZE 10

// 定义结构体
typedef struct _Person {
    char name[20];
    int age;
} Person;

// 声明函数原型
double average(double array[], int n);
Person make_person(char* name, int age);

#endif /* MYHEADER_H */

mylibrary.c

// mylibrary.c
#include "myheader.h"

// 实现函数
double average(double array[], int n) {
    double sum = 0;
    for (int i = 0; i < n; i++) {
        sum += array[i];
    }
    return sum / n;
}

Person make_person(char* name, int age) {
    Person p;
    strcpy(p.name, name);
    p.age = age;
    return p;
}

main.c

// main.c
#include <stdio.h>
#include "myheader.h"

int main() {
    double array[ARRAY_SIZE] = {2.0, 3.0, 5.0, 7.0, 11.0, 13.0, 17.0, 19.0, 23.0, 29.0};

    double avg = average(array, ARRAY_SIZE);
    printf("The average of array is %f\n", avg);

    Person tom = make_person("Tom", 21);
    printf("My name is %s\n", tom.name);
    printf("My age is %d\n", tom.age);

    return 0;
}

在编译时,需要将 “myheader.h” 和 “mylibrary.c” 都包含到编译命令行中:

gcc main.c mylibrary.c -o main

这样就可以编译和运行程序了。