头文件和外部关键字

时间:2014-02-26 18:10:01

标签: c header-files extern

我使用extern变量和头文件时遇到很多问题。我已阅读了各部分书籍并在网上搜索了几个小时,但我一直无法弄明白。任何帮助理解这个问题将不胜感激。以下是我尝试编译时的代码和错误

    #include <stdio.h>
    #include <stdlib.h> 
    #include <string.h>
    #include "sample.h"

    int main()
      {
          int i;
          int gI = 0;
          double recv;

          i = 10;
          gI = i;

          recv = AnotherFunc();

          return 0;
      }

sample.h是以下

      #ifndef SAMPLE
      #define SAMPLE

      extern int gI;
      extern double AnotherFunc(); 

      #endif

另一个是功能

       #include <math.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>
       #include "sample.h"

       double AnotherFunc()
        {
           double someVar;
           int test;

           test = gI;

           someVar = 10.0;  
           return someVar;
         }

当我按以下方式编译时,我得到以下错误,我不明白为什么我会收到这些错误。 sample.h具有变量声明,它应该在AnotherFunc中可见。

          gcc -Wall -ansi -pedantic -c Main.c AnotherFunc.c
          gcc Main.o AnotherFunc.o -o test
          AnotherFunc.o: In function `AnotherFunc':
          AnotherFunc.c:(.text+0x6): undefined reference to `gI'
          collect2: ld returned 1 exit status

我只添加了int gI = 0;因为我想定义它如果我按以下方式修改代码,我也会在main中出错。请看下面。

           #include <stdio.h>
           #include <stdlib.h>
           #include <string.h>
           #include "sample.h"

           int main(int argc, char *argv[])
            {
              int i;
              double recv;

               i = 10;
              gI = i;

              recv = AnotherFunc();

              return 0;
            }

             gcc -Wall -Wstrict-prototypes -ansi -pedantic -c Main.c AnotherFunc.c
             gcc Main.o AnotherFunc.o -o test
             Main.o: In function `main':
             Main.c:(.text+0x1b): undefined reference to `gI'
             AnotherFunc.o: In function `AnotherFunc':
             AnotherFunc.c:(.text+0x6): undefined reference to `gI'
             collect2: ld returned 1 exit status

5 个答案:

答案 0 :(得分:3)

int gI = 0移到main()之外,以便全局可用:

int gI = 0; 
int main()
  {
      int i;

  ....
  } 

答案 1 :(得分:1)

外部变量必须在任何函数之外定义一次;这为它预留了存储空间。该变量还必须在每个想要访问它的函数中声明;

检查此链接。很好地解释了How do I use extern to share variables between source files?

答案 2 :(得分:1)

在使用变量之前,您需要声明变量,然后定义一次。

这是一个声明:

extern int gI;

基本上这只是说有一个名为gI的int将在别处定义。

这是一个定义:

int gI;

这实际上创建了一个名为gI的int。 (从技术上讲,这是一个声明和定义。)

目前,int gI函数中有main行,但这只是一个阴影定义。它是一个局部变量,其名称恰好与声明的全局gI相同,但它不是全局gI。因此,您遇到一个问题,即您声明了一个变量(全局gI)并将其定义为零次。

如果您要将int gI放入sample.h文件中,那么它将包含在您的.c个文件中。这也是一个问题,因为规则是定义变量一次,你将定义两次(每个文件一次)。

解决方案是将extern声明放在.h文件中,将定义放在.c个文件中。

答案 3 :(得分:0)

您在main()函数的范围内定义了gI,这使得它只能从那里看到。我怀疑你真正想要的是一个全局gI变量(因此extern int gI声明)。

如果你想让AnotherFunc()看到它,请将int gI = 0移到外面,例如在与AnotherFunc()定义相同的文件中。

答案 4 :(得分:0)

gI必须在main上方声明:

int gI = 0;

int main(void)
{
    ...
}

通过这样做gI具有文件范围和外部链接。

如果有这样的文件,也许在gI中声明sample.c的更好的地方。