加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如果全局变量有默认的外部链接,为什么我们不能直接在另一个文件

发布时间:2020-12-16 10:03:22 所属栏目:百科 来源:网络整理
导读:我经历了以下问题: Global variable in C are static or not? Are the global variables extern by default or it is equivalent to declaring variable with extern in global? 上面的链接描述了如果我们在一个文件中定义全局变量并且没有指定extern关键字
我经历了以下问题:

> Global variable in C are static or not?
> Are the global variables extern by default or it is equivalent to declaring variable with extern in global?

上面的链接描述了如果我们在一个文件中定义全局变量并且没有指定extern关键字,则由于翻译单元,它们将在另一个源文件中可访问.

现在我有file1.c,它定义了以下全局变量和函数:

int testVariable;

void testFunction()
{
    printf ("Value of testVariable %d n",testVariable);
}

在file2.c中有以下代码

void main()
{
    testVariable = 40;
    testFunction();
}

现在我收到错误:’testVariable’未声明(首次使用此函数) – 为什么?

注意:两个文件都使用makefile在同一程序中使用.

根据我的理解,函数和全局变量都有默认的外部链接.所以函数我们可以直接在另一个文件中使用它的名字,但变量不能为什么?

任何人都有想法吗?

编辑:

从下面的答案我得到的想法,就像在函数旧的编译器将猜测并添加一个隐式声明,但在变量的情况下,它不能.此外,C99删除了隐式声明但仍然在C99模式下收到警告,如:

warning: implicit declaration of function ‘testFunction’.

现在已经通过以下链接:

implicit int and implicit declaration of functions with gcc compiler

它说编译器将其作为诊断目的而不是出错.所以编译器可以向前处理.

但为什么在变量的情况下它无法进一步处理?即使在函数的情况下,如果编译器继续进行,如果实际的定义不存在,那么在链接时它将失败.那么前进有什么好处?

解决方法

这里有两件事情:首先是定义和声明之间存在差异.另一件事是 translation units的概念.

定义是定义变量的定义,它是变量存在的实际位置,编译器为变量保留空间.

编译器需要声明才能知道程序中某处存在符号.如果没有声明,编译器将不知道符号存在.

翻译单元基本上非常简化了源文件及其所有包含的头文件.目标文件是单个翻译单元,链接器使所有翻译单元创建最终程序.

现在,程序只能有一个定义,例如全局变量可能只存在于一个转换单元中,或者在链接时会出现多个定义错误.另一方面,声明可以存在于任意数量的翻译单元中,编译器将使用它来告诉链接器翻译引用另一个(编译时未知)翻译单元的定义.

那么这里发生的是你在file1.c中有一个定义和一个声明.此源文件用作一个转换单元的输入,编译器为其生成单个目标文件,例如file1.o.在另一个源文件file2.c中,没有定义也没有全局变量testVariable的任何声明,因此编译器不知道它存在并且会给它一个错误.你需要声明它,例如通过做

extern int testVariable;  // This is a declaration of the variable

这个函数有点复杂,因为在旧版本的C标准中,没有必要声明正在使用的函数,编译器会猜测并添加一个隐式声明.如果定义和隐式声明不匹配,则会导致未定义的行为,这就是在C99标准中删除隐式函数声明的原因.所以你应该真正声明这个函数:

void testFunction(void);  // Declare a function prototype

请注意,这里不需要extern关键字,因为编译器可以自动告诉它是函数原型声明.

完整的file2.c应该是这样的

extern int testVariable;  // This is a declaration of the variable

void testFunction(void);  // Declare a function prototype

void main()
{
    testVariable = 40;
    testFunction();
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读