为什么我用extern声明但还是显示我重定义?

为什么我用extern声明但还是显示我重定义?

img


在.h文件里面定义的全局变量

img

extern 不是这种用法, 如果你在.h文件中定义了, 并引入了这个头文件, 就不要再次声明, 因为结果像是这样

int *a;
extern int *a;

正确的用法是将其定义在.c或.cpp文件中, 做了隐藏, 也就是多个.c或.cpp文件没有相互包含, 但要用这个变量.
由于非static全局变量有跨文件作用域, 需要它的时候不可再定义, 但可以声明, 只是声明时候要用到extern, 相当于
文件1:

int *a;

文件2:

extern int *a;

两个文件相互不包含, 只在编译时进行连接, 相互隐藏各自的函数, 变量.

重定义的是结构体,不是那几个函数

可以给头文件加上
#program once

上图已经包含了 .h 文件了,extern 声明的两句多余了。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7654262
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C头文件中使用extern定义全局变量
  • 以下回答由chatgpt基于相关博客总结生成:

    如果在一个.h文件中定义了一个全局变量,并在其他文件中使用了extern声明,但是编译时却显示重定义的错误信息,可能有以下原因和解决方案:

    1. 多重包含的问题:如果在多个文件中包含了同一个头文件,那么其中一个文件可能已经定义了全局变量,而编译器在另一个文件中看到了extern声明,就会认为该变量已经定义,从而出现重定义的错误。解决方法是在头文件中加上宏定义来避免重复定义,比如:
    #ifndef MY_HEADER_H
    #define MY_HEADER_H
    
    // 在这里定义全局变量
    
    #endif
    
    1. extern声明位置不正确:如果在其他文件中的extern声明位置不正确,也会导致重定义的错误。正确的位置应该是在其他文件的函数外部进行声明。比如在其他文件中声明全局变量应该像这样:
    // extern声明
    extern int my_global_var;
    
    // 函数定义
    void my_function() {
        // 使用全局变量
        my_global_var = 10;
    }
    
    1. 全局变量定义不当:如果在多个文件中定义了同一个全局变量,就会导致重定义的错误。解决方法是将全局变量定义放在一个文件中,并在其他文件中使用extern声明。比如:

    在定义全局变量的文件(比如global.c)中定义变量:

    int my_global_var = 0;
    

    在其他文件(比如main.c)中使用extern声明:

    extern int my_global_var;
    
    int main() {
        // 使用全局变量
        my_global_var = 10;
    
        return 0;
    }
    

    如果以上方法都不能解决问题,那么需要进一步确定问题来源并进行调试。