当前位置:  开发笔记 > 编程语言 > 正文

这种外在的无害吗?

如何解决《这种外在的无害吗?》经验,为你挑选了3个好方法。

main.h

extern int array[100];

main.c中

#include "main.h"

int array[100] = {0};

int main(void)
{
    /* do_stuff_with_array */ 
}

在main.c模块中,定义并声明了数组.是否包含在模块中的外部声明的行为是否会导致任何问题?

我总是将extern语句可视化为链接器的命令,以"在其他地方寻找实际的命名实体.它不在这里.

我错过了什么?

谢谢.

邪恶.



1> ypnos..:

正确的解释extern是你告诉编译器一些东西.您告诉编译器,尽管现在不存在,但是声明的变量将以某种方式由链接器找到(通常在另一个对象(文件)中).无论你是否有一些外部声明,链接器将是幸运的人找到所有东西并把它放在一起.

为避免将名称(变量,函数,...)暴露在特定对象(文件)之外,您必须使用static.


这个答案中唯一缺少的是对实际问题的回答:"在模块中包含外部陈述的行为是否会引起任何问题?" 答案:没有.
这些评论只是因为"全球"在这里毫无意义而无益.名称有链接:"无,内部,外部".
只有它们是外部的,否则它们是它们所在的编译单元的本地.

2> Evan Teran..:

是的,这是无害的.事实上,我会说这是一个非常标准的方式来做你想要的.

如您所知,它只是意味着包含main.h的任何.c文件也能够查看array和访问它.



3> fizzer..:

编辑

在C和C++中,存在extern表明第一个声明不是定义.因此,它只是在当前翻译单元(包含标题的任何人)中提供名称,并指示所引用的对象具有外部链接 - 即在组成该程序的所有翻译单元中可用.这并不是说对象必然位于另一个翻译单元 - 只是'这条线不是定义'.

结束编辑

在C中,extern是可选的.没有它,第一个声明就是"暂定".如果它不适用于后面的定义(因为它有一个初始化器,它明确地定义了一个定义),这将被视为一个定义(C99 6.9.2).事实上,它只是一个声明而且不会发生冲突.

在C++中,extern它不是可选的 - 没有它,第一个声明是与第二个声明冲突的定义(C++ 03 3.1).

这种差异在C++的附录C中明确指出:

"改变:C++没有C中的"暂定定义"

例如,在文件范围内,

int i;
int i;

在C中有效,在C++中无效."

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有