在C中,extern存储类说明符的重要性和用法

时间:2012-04-10 07:00:44

标签: c++ c

  

可能重复:
  What is external linkage and internal linkage in C++

其实我想知道extern的重要性。

首先我写了一些代码:

file1.h

extern int i;

file2.c中

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

现在我的问题是:当我必须在i中定义file2.c时,extern变量的用途是什么,在file1.h中声明对我有用。< / p>

sudhanshu

7 个答案:

答案 0 :(得分:6)

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

例如,如果将在别处定义,则此功能非常有用。

考虑:

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

当你将这两个函数链接在一起时,会有一个 xyzzyfile2.c中定义的那个,fn将改变的那个

即使没有extern,也会发生这种情况。 extern所做的是声明xyzzy存在 file1.c,这样就不会出现任何I don't know what the blazes "xyzzy" is错误。

在您的特定情况下(如果这些是您唯一的两个文件),您不需要它。只有在您拥有另一个文件#include d file1.h并尝试访问i时才需要它。

答案 1 :(得分:3)

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

foo.h中

extern int i;
void bar();

交流转换器:

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

b.c:

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

正如您所看到的,ia.c之间共享b.c,而不是每个文件重新定义,就像没有extern关键字一样。

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:3)

来自Wikipedia

  

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

     

Extern是一种明确声明变量或强制变量的方法   没有定义的声明

     

如果在文件1中定义了变量,则为了使用它   在另一个文件中的变量,必须声明它。不管   文件数量,此变量仅定义一次,但必须   在包含定义的文件之外的任何文件中声明。

     

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

extern关键字允许你对编译器说...“现在使用这个变量..我将在以后定义并初始化它”..即“现在编译它......我将在以后链接到它的定义”。< / p>

当您在其他文件中定义变量并且想要在当前上下文中使用变量时,可以对该变量进行外部实现。

答案 6 :(得分:1)

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