2013-10-02 2 views
1

Я пытаюсь использовать некоторую глобальную переменную в своем проекте, но не работаю. Я объявил свою переменную так:use extern in C

В файле kernel.h:

extern DBConnection * conn; 

И, на мой другой файл, называемый kernel.c, я это сделать:

#include "kernel.h" 

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

Но, в compile, я получил ошибку:

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

Что я делаю неправильно?

ответ

3

Вы предоставили декларацию, но вам также необходимо определить . Добавьте это в kernel.c, в верхней части после того, как включают:

DBConnection * conn; 
+0

Но, я буду использовать эту переменную во многих файлах ... –

+2

@VitorLuis Вот для чего предназначен заголовок, поэтому все единицы перевода видят одно и то же объявление. Но вам также нужно точно одно определение - компоновщик подберет его и «исправит» другие единицы перевода. – cnicutar

+0

@ Vitor-Luis На самом деле это не ошибка компилятора, а ошибка, обнаруженная во время стадии компоновщика. Поскольку для компиляции выражение extern более чем достаточно, когда компилятор узнал объект и его тип, объявленный в каком-либо другом файле. – Opener

2

extern DBConnection * conn;

объявляет переменную, не определяя его.

Вы должны добавить определение области видимости файла в одном исходном файле, например, в kernel.c:

DBConnection * conn;

2

extern не выделяет память для переменной она квалифицирована, она позволяет только его использоваться. Вам понадобится объявление conn без extern. Вы можете добавить это к вашему kernel.c:

DBConnection * conn; 
+2

* extern не выделяет память для переменной, которую она квалифицирует *, что не соответствует действительности в общем случае. С инициализатором он также определяет его. – ouah

1

Попробуйте:

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

Вам нужно добавить файл сферу соед в kernel.c

1

extern ключевое слово просто заявляет, что есть переменная где-то в конечном связанном двоичном файле, который имеет это имя и тип, он не определяет указанную переменную. Сообщение об ошибке, которое вы получаете, связано с тем, что вы не можете найти определение, на которое ссылается extern.

Определите свой метод в файле .C, вне определения какой-либо функции.

1

использовать переменную во многих файлах объявить его вне функции в любой файл, а затем использовать extern nameofvar, чтобы использовать его в других файлах примеров файл 1:

int externalvar; 

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

файл 2:

extern externalvar; 

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

На самом деле это не ошибка компилятора, а ошибка, обнаруженная во время стадии компоновщика. Потому что для компиляции выражение extern более чем достаточно, когда компилятор узнал объект и его тип, объявленный в каком-то другом файле. Пока компилируемый файл .c-файла знает объект, объявленный где-то, чем он не будет вызывать никаких ошибок. поэтому приведенный ниже фрагмент кода в файле .c также будет не выбросить любую ошибку компиляции.

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

Но в линкере инсценировать kernel.o (объектный файл) в то время как связь выглядит для реального расположения объектов этого ссылка, к тому времени, если он не может найти объект, определенный в другом файле объекта чем ошибка компоновщика.