即使没有声明也使用全局定义

Global definition being used even without declaration

在此代码中:

#include<stdio.h>

int var=100;

int main()
{
    extern int var;        //Declaration not Definition
    printf("%d\n",var);
    return 0;
}

100 被打印出来,这没有什么不正常的,但是当从 main() 中删除声明时,即使这样正在使用全局定义。这是怎么回事?这取自 K&R,上面写着:

The (global) variable must also be declared in each function that wants to access it.

在:

  #include<stdio.h>

  int var=100;

  int main(){...}

var 具有全局文件范围。 main 不需要 extern int var; 知道它。 extern int var; 对于其他 *.c 文件来说很重要,以通知它 var 在其他地方定义。

注:

使用全局变量通常被认为是不好的做法,正是因为它们non-locality:全局变量可能从任何地方被修改。

全局变量也使集成模块变得困难,因为其他人编写的软件可能使用相同的全局名称,除非名称按协议或命名约定保留。

对于在同一文件或模块中声明的变量,无需包含 extern 关键字。全局变量对 main 可见,因为它具有全局范围(即它对 file/module 中的所有函数可见)。

To clarify, using extern int x; tells the compiler that an object of type int called x exists somewhere. It's not the compilers job to know where it exists, it just needs to know the type and name so it knows how to use it. Once all of the source files have been compiled, the linker will resolve all of the references of x to the one definition that it finds in one of the compiled source files.

Source

另一个提示是如果你想在另一个文件中使用extern int var;,你可以在那个文件中声明这段代码。