为什么我用extern声明但还是显示我重定义?
extern 不是这种用法, 如果你在.h文件中定义了, 并引入了这个头文件, 就不要再次声明, 因为结果像是这样
int *a;
extern int *a;
正确的用法是将其定义在.c或.cpp文件中, 做了隐藏, 也就是多个.c或.cpp文件没有相互包含, 但要用这个变量.
由于非static全局变量有跨文件作用域, 需要它的时候不可再定义, 但可以声明, 只是声明时候要用到extern, 相当于
文件1:
int *a;
文件2:
extern int *a;
两个文件相互不包含, 只在编译时进行连接, 相互隐藏各自的函数, 变量.
重定义的是结构体,不是那几个函数
可以给头文件加上
#program once
上图已经包含了 .h 文件了,extern 声明的两句多余了。
如果在一个.h文件中定义了一个全局变量,并在其他文件中使用了extern声明,但是编译时却显示重定义的错误信息,可能有以下原因和解决方案:
#ifndef MY_HEADER_H
#define MY_HEADER_H
// 在这里定义全局变量
#endif
// extern声明
extern int my_global_var;
// 函数定义
void my_function() {
// 使用全局变量
my_global_var = 10;
}
在定义全局变量的文件(比如global.c)中定义变量:
int my_global_var = 0;
在其他文件(比如main.c)中使用extern声明:
extern int my_global_var;
int main() {
// 使用全局变量
my_global_var = 10;
return 0;
}
如果以上方法都不能解决问题,那么需要进一步确定问题来源并进行调试。