两个文件共享相同的函数,可以使用extern
时间: 2024-10-21 10:02:13 浏览: 12
在C/C++程序设计中,当你有两个或更多的源文件需要访问到同一个函数时,为了防止每个文件都独立地复制这个函数的代码,你可以使用关键字`extern`。`extern`的作用是声明一个外部链接,告诉编译器该函数的定义不在当前的源文件里,而在另一个地方。具体来说:
1. **函数声明**:在头文件(.h)中,通常我们会对共享的函数进行声明,使用`extern`标识,这样其他文件就知道有这样一个函数存在,但不会包含它的实际实现。
```c++
extern void sharedFunction();
```
2. **函数定义**:在某个源文件(.cpp)中,提供函数的具体实现,并删除`extern`关键词。这样只有包含此源文件的模块才会链接到这个函数。
```c++
// file1.cpp
void sharedFunction() {
// 函数体...
}
```
3. **链接阶段**:当所有相关的源文件都被编译成目标文件,链接器会把这些外部函数的定义链接在一起,使得程序能够找到并调用它们。
通过这种方式,多个文件可以在各自的上下文中使用同名的函数,而无需担心名称冲突,提高了代码的复用性和维护效率。
相关问题
extern 修饰一个函数
extern是一个关键字,它用于修饰变量和函数。当extern修饰一个函数时,它告诉编译器该函数是在其他文件中定义的,这样编译器在编译当前文件时就不会生成该函数的代码。而是在链接时将该函数的地址替换为定义它的文件中的地址。这种方式可以使得多个文件共享同一个函数,减小代码的冗余。通常来说,我们可以将函数声明放在头文件中,并在需要使用该函数的文件中通过#include指令引入该头文件来使用外部函数。
举个例子,假设我们有两个源文件foo.c和bar.c,foo.c中定义了一个函数func1(),bar.c需要调用func1()。如果我们在bar.c中使用extern声明func1(),并在bar.c中引入foo.h头文件,则编译器会将func1()的调用地址保存下来,在链接时再将它与foo.c中定义的实际函数地址联系起来。
哪里使用了extern
`extern`关键字通常用于C和C++中,它告诉编译器一个变量、函数或其他标识符的定义不在当前作用域内,而是存在于另一个位置。当你在某一个源文件(source file)中声明了一个变量,并在其他文件中需要使用这个变量,但不想在此处复制它的完整定义时,就会使用`extern`。
例如,假设我们有两个源文件,`file1.c` 和 `file2.c`:
```c
// file1.c
extern int global_var;
int main() {
global_var = 10; // 这里只是声明,因为全局变量的定义在file2.c
}
```
而在`file2.c` 中,我们有完整的变量定义:
```c
// file2.c
int global_var; // 这里是全局变量的定义
int initialize_global() {
return global_var;
}
```
在`file1.c`中,尽管我们使用了`global_var`,但是它的实际存储空间和初始值是在`file2.c`中分配的。通过这种方式,`extern`允许我们在多个文件间共享数据。
阅读全文