为什么C语言中,有些.c文件里面也有前面加了extern的变量
时间: 2024-04-09 08:29:40 浏览: 8
在C语言中,使用extern关键字可以声明一个变量,表示该变量是在其他地方定义的。当我们在一个.c文件中使用extern声明一个变量时,它告诉编译器该变量已经在其他地方定义,并且可以在当前文件中使用。
这种情况通常出现在多个.c文件共享同一个全局变量的情况下。通过在某个.c文件中使用extern声明该变量,其他文件就可以访问和使用该变量,而无需重新定义它。
举个例子,假设我们有两个.c文件:file1.c和file2.c。在file1.c中定义了一个全局变量x,并且在file2.c中也需要使用这个变量。为了让file2.c知道x已经在file1.c中定义了,我们可以在file2.c中使用extern关键字声明该变量,而无需重新定义它。
这样做的好处是可以提高代码的可维护性和可扩展性,因为不同的文件可以共享相同的全局变量,方便数据的共享和传递。但需要注意的是,extern关键字只是声明变量,并不分配内存空间,真正的定义和分配内存发生在其他文件中。
相关问题
在linux下写一个c语言的头文件.h,其中有一个结构体变量是引用另外一个C++的.h文件中定义的枚举变量,使用extern c使得能够编译通过这个.c文件
可以按照以下步骤编写头文件:
1. 在头文件中包含需要引用的C++头文件,并使用extern "C"包裹起来,表示使用C语言的编译方式。
```c
#ifdef __cplusplus
extern "C" {
#endif
#include "other_cpp_header.h"
typedef struct {
enum Color color;
int size;
} MyStruct;
#ifdef __cplusplus
}
#endif
```
2. 在C++头文件中定义枚举变量:
```cpp
// other_cpp_header.h
enum Color {
RED,
GREEN,
BLUE
};
```
3. 在C文件中包含上述头文件,然后使用MyStruct结构体变量即可:
```c
#include "my_header.h"
int main() {
MyStruct s;
s.color = RED;
s.size = 10;
return 0;
}
```
编译时需要先将C++头文件编译成目标文件,然后再将C文件和目标文件链接起来:
```bash
g++ -c other_cpp_header.h -o other_cpp_header.o
gcc main.c other_cpp_header.o -o main
```
c语言中extern 如何定义到头文件中被其他.c文件使用
在 C 语言中,你可以将 `extern` 声明放在头文件中,然后在需要使用该变量或函数的源文件中包含该头文件即可。
例如,在头文件 `myheader.h` 中声明一个全局变量:
```c
extern int my_global_variable;
```
然后在 `source1.c` 和 `source2.c` 中分别定义和使用该变量:
```c
// source1.c
#include "myheader.h"
int my_global_variable = 42;
// source2.c
#include "myheader.h"
void foo() {
int x = my_global_variable + 1;
// ...
}
```
在上面的例子中,`my_global_variable` 被定义在 `source1.c` 中,并在 `myheader.h` 中声明为 `extern`。在 `source2.c` 中,我们可以通过 `#include "myheader.h"` 来引用该变量,并在函数 `foo()` 中使用它。
注意,为了避免重复定义,你需要在一个源文件中定义该变量,而其他源文件中只能声明为 `extern`。另外,你也需要确保头文件中只包含变量或函数的声明,而不是定义,否则可能会导致重复定义的编译错误。