使用头文件进行编译

时间:2010-10-20 09:40:47

标签: c compilation header-files

使用以下命令编译main.c文件:

gcc main1.c -o final

给了我:

/tmp/cc1cwhAP.o: In function `main':
main1.c:(.text+0xb): undefined reference to `hi'
main1.c:(.text+0x15): undefined reference to `hi'
collect2: ld returned 1 exit status

main1.c:

#include <stdio.h>
#include "incl.h"

int main(void)
{
 hi = 1;
 printf("hi = %d",hi);
 return(0);
}

incl.h:

extern int hi;

我做错了什么? (请详细说明你的答案)

删除extern关键字可以解决问题,但我希望能够在其他源文件中使用hi变量。

4 个答案:

答案 0 :(得分:3)

您已经告诉编译器存在一个名为hi的变量,但您实际上没有定义它。

有两种方法可以解决这个问题:

  1. extern关键字放在头文件中的声明中。这是 BAD
  2. 在源文件中声明变量。这可以是main1.c或链接到程序的其他源文件。这是好方法。

答案 1 :(得分:1)

当你声明一个变量extern时,它意味着编译器将在某些c模块中定义它,并且应该在链接期间找到它。

您仍需要在一个.c文件中定义全局int hi。 包含头文件的任何.c文件都可以使用它。

答案 2 :(得分:1)

让我们忘记一些头文件(在编译期间将所有内容插入源文件之后,它们仅在预处理期间存在)。它们只是在几个源文件中使用相同代码的简单方法(想想复制/粘贴)。因此,为了提高效率,重复的代码应该什么都没有;或者我们冒险做不止一次的事情。

int x; /* puts aside a memory area with space for an int and call it x */
extern int x; /* tell the compiler that x exists and it is an int */

以上哪项做得少?这是放入头文件的那个。但正如我们已经告诉编译器x存在的那样,我们需要在某处实际定义它。定义它的最佳位置是源文件。

由于头文件无法执行任何操作,因此插入大量源文件非常安全

现在,回到头文件。它们通常链接到特定的源文件(通过它们的名称:foobar.h链接到foobar.c)。这是识别头文件中声明 定义的好方法。

/* foobar.h */
extern int x;
void myfoo(int);

看到此标头文件后,我希望foobar.c包含xmyfoo的定义。

/* foobar.c */
int x;                /* global x. BAD BAD BAD */
void myfoo(int alpha) { x = !x; return x ? alpha : 0; }

为什么全局变形很糟糕?

引自http://c2.com/cgi/wiki?GlobalVariablesAreBad

  

使用全局变量的原因非常糟糕

     
      
  • “我是一个慢打字员.Globalbals为我节省了击键。”
  •   
  • “我不想一直传递它。”
  •   

答案 3 :(得分:0)

将实际int hi放入您的某个源代码中。然后extern将参考。