头文件(.h
文件)中的声明默认是 extern
的,即使你没有显式地写出 extern
关键字。这样做是因为头文件的目的是提供符号的声明,而不是定义(即不提供函数或变量的具体实现)。C 和 C++ 编译器会默认认为头文件中的全局函数和变量声明是 extern
,即这些符号在其他源文件中定义。
例子:
没有 extern
显式声明的情况
// core_section.h
#ifndef CORE_SECTION_H
#define CORE_SECTION_H
int CoreSectionInit(void); // 这行默认就是 extern int CoreSectionInit(void);
#endif // CORE_SECTION_H
这里的 int CoreSectionInit(void);
仅仅是声明了该函数,它相当于 extern int CoreSectionInit(void);
,编译器会默认假设它是 extern
,并且它在其他源文件中有定义。
明确使用 extern
声明的情况
// core_section.h
#ifndef CORE_SECTION_H
#define CORE_SECTION_H
extern int CoreSectionInit(void); // 显式声明为 extern
#endif // CORE_SECTION_H
在这个例子中,extern
明确地告诉编译器该函数在其他地方定义,但实际上这两种写法在功能上是一样的。对于外部符号(如函数和全局变量),C 和 C++ 编译器默认会假定它们是 extern
的,意味着它们在其他地方有定义。
为什么头文件中的声明默认是 extern
?
- 头文件中的内容通常是为了让多个源文件共享声明,而不是定义。
- 头文件用于声明变量和函数等,以便其他源文件能够引用它们。为了避免重复定义,声明默认是
extern
,意味着它们的实际定义会在其他地方找到。 - 如果你在头文件中显式定义了某个变量或函数(如全局变量定义、内联函数等),那就不需要使用
extern
了,因为它的定义已经包含在头文件中。
结论
- 头文件中函数和变量的声明默认是
extern
,即使没有显式写出extern
,编译器也会假定它们是外部符号。 - 如果你在头文件中需要定义(而不仅是声明)一个变量或函数,才需要特别声明为
extern
,或者将其定义放入源文件中。