如何写头文件
.h
不写实现,只写声明,同名的 .c
写实现。
.h
可以定义类型,甚至自己的.c文件包括自己的#include "Graph.h"
(必须!)来获取这个类型,.c
无须自行再定义类型。
.h头文件extern关键字
在 C 语言中,extern 关键字用于声明一个变量或函数是在其他文件中定义的,从而在多个文件间共享数据或函数。这种机制在大型项目中非常有用,可以避免重复定义,提升代码的组织性。
extern 的主要作用
声明外部变量:通过
extern
声明变量时,告诉编译器该变量在其他文件中已经定义,当前文件只是引用它。外部函数的声明:如果一个函数在其他文件中实现,而当前文件想要调用它,可以通过
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!