请你说说 extern 的作用,extern变量在哪个数据段,为什么要 extern C
时间: 2023-11-21 07:50:46 浏览: 315
extern是C++中的关键字,用于声明一个变量或函数的外部链接性。它的作用有两个方面:
1. 声明外部变量:使用extern关键字可以声明一个在其他源文件中定义的全局变量,使得当前源文件可以引用该变量而不需要重新定义。这样可以在不同的源文件中共享同一个全局变量。
2. 声明外部函数:使用extern关键字可以声明一个在其他源文件中定义的函数,使得当前源文件可以引用该函数而不需要重新定义。这样可以实现函数的模块化和代码的复用。
extern变量通常存储在静态存储区(也称为数据段)中。静态存储区包括全局变量、静态变量和常量等。这些变量在程序运行期间一直存在,不会随着函数的调用结束而销毁。
关于为什么要使用extern C,主要是为了解决C++编译器对函数名进行修饰(Name Mangling)的问题。C++编译器会根据函数的参数类型和个数等信息对函数名进行修改,以实现函数的重载。而C语言不支持函数重载,因此其函数名不会被修饰。
当C++代码需要调用C语言的函数时,由于函数名修饰的问题,需要使用extern "C"来告诉编译器要按照C语言的命名规则来处理函数名,以确保能够正确链接和调用C语言的函数。
总结起来,extern关键字用于声明外部变量和函数,extern变量存储在静态存储区,extern "C"用于处理C++和C语言之间的函数调用问题。
相关问题
c语言中引用变量除了extern还有什么办法
### C语言中除 `extern` 外的其他引用变量方法
#### 使用指针访问变量
在C语言中,可以通过指针来间接访问和操作变量。这种方式不仅限于同一文件内,在不同文件之间也可以传递指针地址。
```c
// FileA.c
#include <stdio.h>
int *ptr;
void setPtr(int *p) {
ptr = p;
}
void printValue() {
printf("The value is %d\n", *ptr);
}
```
```c
// FileB.c
#include <stdio.h>
#include "FileA.c"
int main() {
int var = 10;
setPtr(&var); // 将main函数内的var地址传给setPtr函数设置全局指针
printValue(); // 输出:The value is 10
return 0;
}
```
这种方法利用了指针特性实现了跨文件的数据共享[^1]。
#### 宏定义实现数据共享
宏定义可以在编译预处理阶段替换指定字符串,因此可以用来创建一种形式上的“引用”。
```c
#define GLOBAL_VAR (global_var)
int global_var = 20;
```
这样做的好处是可以方便地更改实际使用的变量名称而不需要改动大量代码。不过需要注意的是这并不是真正意义上的引用机制而是简单的文本替换[^2]。
#### 静态全局变量与模块化编程
当希望某个变量只在一个特定源文件内部可见而不被其他地方直接访问时,则可采用静态全局变量的方式:
```c
static int internalVar = 30; // 只能在本文件范围内使用internalVar
```
这种做法有助于提高程序的安全性和封装性,同时也减少了命名冲突的可能性[^3]。
c++ extern 共享变量
在 C++ 中,`extern` 关键字用于声明而不是定义变量。当你在一个作用域(如函数、文件或命名空间)中使用 `extern` 声明一个变量,实际上是在告诉编译器这个变量存在于另一个地方,需要链接阶段才能找到其实际的定义。如果你在头文件(`.h`)中使用 `extern` 定义变量,那么它被称为外部变量或全局变量,可以在程序的不同源文件中共享。
例如:
```cpp
// 文件 header.h
extern int sharedVariable;
// 文件 source.cpp
int sharedVariable = 0; // 这里是变量的定义
void someFunction() {
sharedVariable = 42;
}
// 另一个源文件 another_source.cpp
#include "header.h"
someFunction(); // 调用函数会修改 sharedVariable 的值
```
在这个例子中,`sharedVariable` 是在编译期间作为外部引用存在,而实际的变量定义在 `source.cpp` 中。这样可以方便地在多个模块之间共享数据,同时保持了封装性和模块化。
阅读全文
相关推荐














