c++ 多文件全局变量在链接时被重复定义
时间: 2023-07-15 07:14:37 浏览: 64
在C++中,如果你在多个源文件中定义了同名的全局变量,那么在链接阶段就会出现重复定义的错误。
为了避免这种情况,可以使用 extern 关键字来声明这个变量,将它的定义放在一个单独的源文件中。如下所示:
```cpp
// global_var.h
#ifndef GLOBAL_VAR_H
#define GLOBAL_VAR_H
extern int g_var;
#endif
// global_var.cpp
#include "global_var.h"
int g_var;
// main.cpp
#include "global_var.h"
int main()
{
g_var = 10;
// ...
return 0;
}
```
在这个例子中,我们将全局变量 g_var 的定义放在了 global_var.cpp 文件中,并在 global_var.h 文件中使用 extern 关键字来声明它。然后在 main.cpp 中,我们通过包含 global_var.h 文件来使用这个全局变量。
这样编译时,每个源文件都只会看到该全局变量的声明,并不会出现重复定义的问题。链接时则会将所有文件中的全局变量合并起来。
相关问题
c++ 多头文件定义全局变量 重复包含
在 C++ 中,如果多个头文件都包含了同一个全局变量的定义,那么编译器会报错,提示“重复定义”。这是因为每个源文件都会被编译成一个单独的目标文件,如果多个源文件都包含了同一个全局变量的定义,那么链接时就会出现重复定义的情况。
解决这个问题的方法有以下几种:
1. 使用 include guards
在每个头文件的开头和结尾加上如下代码:
```
#ifndef MY_HEADER_H
#define MY_HEADER_H
// 头文件内容
#endif
```
这样可以防止头文件被重复包含,如果已经包含过了,就不再包含。
2. 使用 #pragma once
在每个头文件的开头加上如下代码:
```
#pragma once
// 头文件内容
```
这样也可以防止头文件被重复包含,但是需要编译器支持 #pragma once。
3. 将全局变量定义放在一个单独的源文件中
将全局变量的定义放在一个单独的源文件中,并在需要使用它的源文件中包含该头文件即可。
4. 使用 extern
在头文件中声明全局变量,但是不要定义它,只在一个源文件中定义它,其他源文件中使用 extern 来引用它即可。
例如,在头文件中声明:
```
extern int g_my_variable;
```
在一个源文件中定义:
```
int g_my_variable = 0;
```
在其他源文件中使用:
```
extern int g_my_variable;
```
c++ 多文件全局变量
在 C 语言中,多文件全局变量可以通过在不同的文件中声明和定义来实现。
1. 声明全局变量
在一个文件中声明全局变量,可以使用 extern 关键字。例如,在一个名为 a.h 的头文件中声明一个全局变量:
```
// a.h
extern int global_var;
```
2. 定义全局变量
在另一个文件中定义全局变量,需要在文件开头声明该全局变量。例如,在一个名为 b.c 的文件中定义全局变量:
```
// b.c
#include "a.h"
int global_var = 0;
```
3. 使用全局变量
在需要使用全局变量的文件中,只需要包含头文件即可。例如,在一个名为 main.c 的文件中使用全局变量:
```
// main.c
#include "a.h"
int main() {
global_var = 1;
return 0;
}
```
需要注意的是,多文件全局变量的命名应该遵循命名约定,以避免命名冲突。同时,全局变量的使用应该谨慎,因为全局变量会增加代码的耦合性,使得代码难以维护和调试。