header file

  1. 如何写头文件
  2. .h头文件extern关键字
    1. extern 的主要作用
    2. 只声明变量不声明函数
  3. #ifndef : 避免头文件被重复包含
    1. 工作原理
    2. 示例

如何写头文件

.h 不写实现,只写声明,同名的 .c 写实现。

.h可以定义类型,甚至自己的.c文件包括自己的#include "Graph.h"(必须!)来获取这个类型,.c无须自行再定义类型。

.h头文件extern关键字

在 C 语言中,extern 关键字用于声明一个变量或函数是在其他文件中定义的,从而在多个文件间共享数据或函数。这种机制在大型项目中非常有用,可以避免重复定义,提升代码的组织性。

extern 的主要作用

  1. 声明外部变量:通过 extern 声明变量时,告诉编译器该变量在其他文件中已经定义,当前文件只是引用它

  2. 外部函数的声明:如果一个函数在其他文件中实现,而当前文件想要调用它,可以通过 extern 进行声明,虽然通常在头文件中声明函数时会省略 extern 关键字。

注意事项:仅用于声明:extern 只能声明变量或函数,不能用于定义。定义时不需要 extern。

默认作用域:如果一个变量在 .c 文件中不带 extern 关键字直接声明,那么它在整个文件中有效,但不对其他文件可见。

只声明变量不声明函数

extern 实际上可以用于声明函数,不过它在函数声明中通常是可选的。因为默认情况下,函数声明已经具有外部链接性,extern 关键字对函数声明没有额外作用。

// 声明在其他文件定义的变量

extern int myVariable;

// 下面两种写法等价,都是声明函数在其他地方定义

extern void myFunction();
void myFunction();  // 等价于上面的声明

#ifndef : 避免头文件被重复包含

if not defined(“如果没有定义”)

#ifndef 是一个预处理指令,用于条件编译。它的主要用途是防止头文件被多次包含。通常,它与 #define#endif 一起使用,以确保一个文件只会被包含一次。这样可以避免由于重复包含同一文件而导致的编译错误

例子:

#ifndef EXAMPLE_H
#define EXAMPLE_H

// 这里是头文件的内容
void myFunction();
#endif // EXAMPLE_H

工作原理

  • 当编译器第一次遇到 #ifndef EXAMPLE_H 时,由于 EXAMPLE_H 尚未定义,它将继续编译并定义 EXAMPLE_H。

  • 如果该头文件被后续其他文件再次包含,#ifndef 会发现 EXAMPLE_H 已经定义,编译器将跳过该文件的内容,从而避免重复定义。

示例

graph.h直接定义成GRAPH_H即可,不需要真赋值。

头文件保护的完整示例:

#ifndef GRAPH_H
#define GRAPH_H
# define GRAPH_H 实际上并没有给 GRAPH_H 赋予一个具体的值。它只是定义了一个宏,这个宏的存在与否是它的唯一目的。

// 头文件内容,例如函数声明和变量声明
void myFunction();
extern int myVariable;

#endif // GRAPH_H

Welcome to point out the mistakes and faults!