对于extern在两个文件中的使用搞不清楚,代码出错了

img

img


我在一个程序中设了一个全局变量a=1,在另一个extern2程序中又调用了它,但是出错了,不知道为啥呀?

1.一个工程里只能有一个main函数,另一个要改名
2.文件2里面想使用文件1里面定义的变量a,要先include 文件1,否则肯定报错变量没有定义
3.extern要写在文件2里,而不是文件1里,文件1里正常定义int a,文件2里写extern int a,表示想要共享文件1里的变量而不是新建变量
4.既然你想要共享文件1里的变量,那么肯定是想要共享它的值,那么extern int a这里就不要对它初始化赋值

用法没搞清楚导致,一种比较标准的做法是,
引用全局变量是加上extern关键字,
在出处也就是定义的地方不要加extern。
还有就是引用的同时不能初始化,因为引用就是声明的意思,表示这个变量在其它地方被定义了,告诉编译器。
例如文件1.c中定义a
int a=1;

然后我们在2.c中声明这个a
extern int a;//这里不要赋值,要赋值等我们使用的时候再给它赋值就行

不知道这样说,你能不能看懂!

  1. img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    我能够解决该问题。

    针对该问题,首先需要检查以下几点:

    1. 确认两个文件的变量名称一致,是否都是"int a"。
    2. 确认使用extern的文件中,是否有对变量的声明,是否声明的方式正确。
    3. 检查编译命令,是否将两个文件都编译到可执行文件中,并且将相应的目标文件链接起来。

    除此之外,还需要注意以下几点:

    1. 全局变量的定义一般都放在.c文件中,而不是头文件.h中,因为头文件中的定义一般只是声明,而不是定义。
    2. 如果多个文件需要共享变量,可以将变量定义在一个.c文件中,并且在另外的文件中使用extern进行声明。
    3. 如果有多个源文件,需要将它们编译为一个可执行文件,并且链接相应的目标文件。
    4. 如果使用了库文件,需要确保链接正确,否则会导致找不到变量的错误。

    针对以上问题,可以采取以下解决方案:

    // 文件1: main.c int a = 1; // 定义全局变量a

    int main() { // do something return 0; }

    // 文件2: extern2.c extern int a; // 使用extern关键字访问变量a

    void func1() { // do something with variable a }

    编译命令可以为:

    gcc -o myprogram main.c extern2.c

    其中,myprogram是可执行文件的名称,main.c和extern2.c是需要编译的源文件。

    这样编译后,就会生成一个名为myprogram的可执行文件,可以直接运行。

    需要注意的是,在使用extern关键字时,需要在使用变量的文件中进行声明,否则会出现找不到变量的错误。同时,也需要确保文件的编译顺序正确,即先编译定义变量的文件,再编译使用变量的文件。

    以上就是针对问题的解决方案,希望能对您有所帮助。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你怎么有两个main?其中一个要改名
而且你用extern int a;
另一个程序要写 int a;对应