在C中使用extern

时间:2013-10-02 20:20:54

标签: c linux extern

我尝试在我的项目中使用一些全局变量,但是不起作用。我声明我的变量是这样的:

在文件kernel.h中:

extern DBConnection * conn;

而且,在我的另一个名为kernel.c的文件中,我这样做:

#include "kernel.h"

int get_info() {
    conn = (DBConnection *) malloc(sizeof(DBConnection));
}

但是,在编译时,我收到了一个错误:

/home/fastway/VFirewall-Monitor/kernel.c:19: undefined reference to `conn'

我做错了什么?

7 个答案:

答案 0 :(得分:3)

您提供了声明,但您还需要定义。将其添加到您的kernel.c,在include后面的顶部:

DBConnection * conn;

答案 1 :(得分:2)

extern DBConnection * conn;

声明变量而不定义它。

您需要在一个源文件中添加文件范围定义,例如在kernel.c中:

DBConnection * conn;

答案 2 :(得分:2)

extern不为其符合条件的变量分配内存,只允许使用它。您需要conn的声明,而不需要extern。您可以将它添加到kernel.c:

DBConnection * conn;

答案 3 :(得分:2)

试试这个:

#include "kernel.h"
DBConnection * conn
int get_info() {
    conn = (DBConnection *) malloc(sizeof(DBConnection));
}

您需要在kernel.c中添加conn的文件范围

答案 4 :(得分:1)

extern关键字只是声明最终链接二进制文件中某个变量具有该名称和类型,它不定义所述变量。您收到的错误消息是无法找到extern所指的定义。

在任何函数定义之外的.C文件中定义方法。

答案 5 :(得分:1)

在许多文件中使用变量将其声明在任何文件中的函数之外,然后使用extern nameofvar在其他文件示例中使用它 文件1:

int externalvar; 

main(void)
{
    //stuff ...
}

文件2:

extern externalvar;

void someFunc(void)
{
   externalvar = 5;
  //stuff ...
}

答案 6 :(得分:1)

实际上这不是编译器错误,而是在链接器阶段发现的错误。因为,对于编译,extern声明足以让编译器知道一个对象及其在其他文件中声明的类型。只要可编译文件.c文件知道在某处声明的对象,它就不会抛出任何错误。所以.c文件中的以下代码片段也会抛出任何编译错误。

extern DBConnection * conn
int get_info() 
{
   conn = (DBConnection *) malloc(sizeof(DBConnection));
}

但是在链接器阶段,kernel.o(目标文件)在链接时会查找此对象引用的实际位置,到那时它是否无法找到在某个其他目标文件中定义的此对象而不是链接器错误将被抛出。