使用以下命令编译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
变量。
答案 0 :(得分:3)
您已经告诉编译器存在一个名为hi
的变量,但您实际上没有定义它。
有两种方法可以解决这个问题:
extern
关键字放在头文件中的声明中。这是 BAD !答案 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
包含x
和myfoo
的定义。
/* 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将参考。