extern为什么必须写在.h文件里
时间: 2024-04-17 12:28:30 浏览: 126
在C/C++中,extern关键字通常用于声明一个变量或函数是在其他文件中定义的。当你在一个文件中使用extern声明一个函数或变量时,编译器会知道它们在其他文件中定义,并且可以在链接时将它们连接起来。
通常情况下,我们会将这些外部定义的函数或变量的声明放在头文件中,以便其他文件可以包含这个头文件,并在需要使用这些变量或函数时使用extern来引用它们。这样做的好处是可以避免重复定义同名符号,同时也可以使代码更加清晰和易于维护。
因此,extern关键字通常会出现在头文件中,以确保在不同的文件中使用相同的符号时,编译器能够正确地解析它们。
相关问题
共用体在A.c文件定义,A.h文件extern声明共用体且包含c.h,c.h头文件包含A.h与b.h,A.c包含A.h文件,b.c包含吧b.h,b.h包含c.h。b.c用共用体,但是keil编译时说b.c的共用体未定义,怎么解决
共用体在C语言中用于定义一组共享内存空间的不同变量版本。当你在一个`.c`文件(如`A.c`)中定义共用体,而在对应的`.h`文件(如`A.h`)中`extern`声明,然后通过头文件`c.h`传播到其他的`.c`文件(`b.c`),可能会出现你在`b.c`中使用共用体但报错“未定义”的情况,这是因为链接阶段找不到完整的共用体定义。
为了解决这个问题,你可以按照以下步骤操作:
1. **确保共用体声明和定义匹配**:
- 在`A.h`中`extern`声明共用体(仅声明):
```c
#ifndef A_H
#define A_H
extern union MyUnion {
// 共用体内容...
} myUnion;
#endif /* A_H */
```
- 在`A.c`中提供完整定义:
```c
#include "A.h"
union MyUnion {
// 具体的成员...
};
```
2. **保持头文件的依赖顺序清晰**:
- `c.h`应该只包含`A.h`,避免循环依赖:
```c
#ifndef C_H
#define C_H
#include "A.h"
// ...其他内容...
#endif /* C_H */
```
3. **在`b.h`中正确包含`c.h`**:
```c
#ifndef B_H
#define B_H
#include "c.h" // 注意这里直接包含c.h
// ...其他内容...
#endif /* B_H */
```
4. **在`b.c`中`#include`适当的头文件**:
```c
#include "B.h"
```
现在,如果你遵循以上步骤,你应该能够成功地在`b.c`中使用`MyUnion`共用体了,因为链接器会找到完整的定义。
extern int 在.h文件中声明了在.c文件中怎么用
在C语言中,当你想在一个`.c`源文件中引用一个在`.h`头文件中声明的全局变量(包括静态全局变量),你需要使用`extern`关键字。`.h`文件中的声明通常是这样的:
```c
// my_header.h
extern int global_variable;
```
然后,在`.c`文件中,如果这个变量还没有被初始化,通常会像这样声明并分配内存:
```c
// my_file.c
#include "my_header.h"
int global_variable; // 如果是在这里首次声明并初始化
int main() {
// 现在可以直接使用global_variable,但实际数值未定,可能需要在某个地方初始化
global_variable = some_initial_value;
return 0;
}
```
如果你在`.c`文件中已经对这个变量进行了定义,那么在`.h`文件中就不需要再声明了,但在头文件中保留`extern`声明有助于保持接口的一致性:
```c
// my_file.c
#include "my_header.h"
int global_variable = some_initial_value; // 实际的变量定义
int main() {
// 直接使用
return 0;
}
```
记住,每次修改`global_variable`的值都会影响所有链接到该文件的其他部分。因此,外部链接的`extern int`应尽可能地减少,以防数据不一致。
阅读全文