关于extern关键字和多个源文件的困惑

问题描述 投票:0回答:3

我试图完全理解extern的工作原理,所以我创建了3个文件,其中两个是源文件,最后一个是头文件。这是每个中包含的内容:testingfile1.c

#include <stdio.h>
#include "testingheader.h"
int main() {
    change();
    int my_extern;
    printf("\n%d", my_extern);
    return 0;

}

testingfile2.c:

#include <stdio.h>
#include "testingheader.h"
void change() {
    int my_extern;

    my_extern = 15;
    printf("%d", my_extern);
}

testingheader.h:

#if !defined(TESTINGHEADER_H)
#define TESTINGHEADER_H

#include <stdio.h>
extern int my_extern;
void change();

#endif

该程序的输出是:150。但是,我认为my_extern是一个extern int,如果要更改一个源文件中的值,那么它将在所有其他源文件中更改它的值。这不是extern的工作方式吗,还是我在代码本身中做错了什么?

c extern
3个回答
1
投票

在两种情况下,都将int my_extern;移到您拥有的位置,因为它们变成了碰巧具有相同名称my_extern的局部变量。

extern int my_extern;只是意味着“在某处”存在一个称为my_extern的整数。因此,您必须在文件范围的某个地方声明int my_extern,例如这样:

int my_extern = 0;

void change() {
    my_extern = 15;
    printf("%d", my_extern);
}

0
投票

问题是您在函数内部重新声明了int my_extern;。因此,C将其视为与全局my_extern分开的变量。]​​>

extern int my_extern;语句声明将在某个地方声明名为int的全局my_extern。您还没有做到。而是创建了本地my_extern变量。


0
投票

在testingfile2.c中,'my_extern'变量是该函数的本地变量,您没有看到extern命令所引用的全局'my_extern'。当然,您没有have

© www.soinside.com 2019 - 2024. All rights reserved.