【问题标题】:In C, importance and usage of extern storage class specifier [duplicate]在C中,extern存储类说明符的重要性和用法[重复]
【发布时间】:2012-04-22 11:43:26
【问题描述】:

可能重复:
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;
}

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

苏丹舒

【问题讨论】:

    标签: c++ c


    【解决方案1】:

    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 错误。

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

    【讨论】:

    • +1 我喜欢你对“声明”和“定义”的定义
    【解决方案2】:

    当你有三个文件时它很有用:

    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.cb.c 之间共享,而不是按文件重新定义,就像没有 extern 关键字时那样。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        来自Wikipedia

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

        Extern 是一种显式声明变量或强制 没有定义的声明

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

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

        【讨论】:

          【解决方案5】:

          使用 extern 告诉编译器它是一个变量声明。

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 2016-11-11
                • 2018-08-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多