1

可能重复:
什么是 C++ 中的外部链接和内部链接

其实我想知道的重要性extern

首先我写了一些代码:

文件1.h

extern int i;

文件2.c

#include<stdio.h>
#include "file1.h"
 int i=20;
int main()
{
   printf("%d",i);
   return 0;
}

现在我的问题是:当我必须定义iin时,使用 extern 变量有什么用file2.c,声明 infile1.h对我有用。

苏丹树

4

7 回答 7

6

extern允许您声明一个变量(通知编译器它的存在)而不定义它(使其存在)。一般规则是您可以根据需要多次声明事物,但您只能定义一次。

例如,如果它将在别处定义,这将很有用。

考虑:

file1.c:                   file2.c:
    extern int xyzzy;          int xyzzy;
    void fn (void) {
        xyzzy = 42;
    }

当您将这两个函数链接在一起时,将有一个 xyzzy,定义在file2.c中的一个,这就是fn将更改的那个。

现在即使没有extern. 所做的extern是声明xyzzy存在 file1.c以便您不会收到任何I don't know what the blazes "xyzzy" is错误。

在您的特定情况下(如果这是您仅有的两个文件),您不需要它。仅当您有另一个#includedfile1.h并尝试访问的文件时才需要它i

于 2012-04-10T07:04:22.363 回答
3

C 中的“extern”声明表示存在全局变量及其类型。

在 C 中,大多数 .c 文件的行为就像一个单独的模块。因此,带有“extern”的变量是在当前模块外部定义的。

在一个地方定义全局,然后在所有其他地方声明对它的外部引用始终是一种更好的做法。在引用任何共享库提供的全局变量时,这很重要,以确保您的代码引用了正确且通用的变量实例。

于 2012-04-10T07:09:29.370 回答
3

当您有三个文件时,它很有用:

foo.h

extern int i;
void bar();

交流:

#include "foo.h"
int i = 6;
int main(){
    bar();
}

公元前:

#include "foo.h"
void bar(){
      printf("%d\n", i);
}

正如您所看到的,它在andi之间共享,而不是在每个文件中重新定义,就像没有关键字一样。a.cb.cextern

于 2012-04-10T07:05:18.857 回答
3

来自维基百科

定义变量时,编译器会为该变量分配内存,并可能还将其内容初始化为某个值。声明变量时,编译器要求在别处定义该变量。该声明通知编译器存在具有该名称和类型的变量,但编译器不需要为它分配内存,因为它是在其他地方分配的。

extern 是一种显式声明变量的方法,或者在没有定义的情况下强制声明

如果在文件 1 中定义了一个变量,为了在另一个文件中使用相同的变量,必须声明它。不管文件的数量是多少,这个变量只定义一次,但是,它必须在包含定义的文件之外的任何文件中声明。

如果程序在多个源文件中,并且在 file1 中定义了一个变量并在 file2 和 file3 中使用,则需要在 file2 和 file3 中声明 extern 来连接变量的出现。

于 2012-04-10T07:12:54.050 回答
1

让 extern 告诉编译器它是一个变量的声明。

在您在 file1.h 中的示例中,想象一下如果您没有指定 extern 关键字会发生什么。看起来 int i 有两个定义。此外,头文件可以包含在许多 .c 文件中。如果您编译这些 .c 文件并链接它们,链接器将看到同一变量的多个定义。

于 2012-04-10T07:05:02.887 回答
1

标头中的声明允许您从多个源文件访问变量,同时仍然只在一个地方定义它。

于 2012-04-10T07:39:19.073 回答
1

extern 关键字允许您对编译器说...“现在使用这个变量.. 我稍后会定义和初始化它”.. 即“现在编译它.. 我稍后会链接到它的定义”。

当您在其他文件中定义变量并希望在当前上下文中使用它时,您可以将其外部化。

于 2012-04-10T07:14:16.140 回答