проблема компоновщика g ++ - PullRequest
2 голосов
/ 22 июня 2011

Я пытаюсь понять ключевое слово extern в C ++ и написал короткий код, чтобы обрисовать смысл.К сожалению, я делаю что-то не так

bla.h

int bla = 4;

test.cpp

#include <iostream>

using namespace std;

int main() {
       extern int bla;
       cout << bla << endl;
}

g++ -o test bla.h test.cpp
/tmp/ccED67jz.o: In function `main':
test.cpp:(.text+0xa): undefined reference to `bla'
collect2: ld returned 1 exit status

Ответы [ 3 ]

4 голосов
/ 22 июня 2011

extern, описание, которое вы описываете, работает только для глобалов:

bla.cpp

int bla = 4;

test.cpp

#include <iostream>

extern int bla; // use the global from bla.cpp as a global in this file

int main(int argc, char *argv[]) {
    std::cout << bla << "\n";
    return 0;
} 
1 голос
/ 22 июня 2011
  • никогда не определяйте переменные в заголовках (вот где вы должны использовать extern)
  • никогда не объявляйте локальную переменную extern, эти переменные всегда являются глобальными, и объявление их локально вызывает путаницу

Что означает extern: не создавайте переменную здесь, она уже существует в другом месте. Часть "в другом месте" означает в другом модуле компиляции.

Например:

file1.c

int x;

file2.c

extern int x; /* x already exists in file1.c */

int main()
{
    x = 10;
}

Компилировать так:

gcc file1.c file2.c
1 голос
/ 22 июня 2011

Используйте это больше как это.

test.cpp

extern int bla;

int main(int argc, char** argv)
{
    cout << bla << endl;
    return 0;
}

other.cpp

int bla;

g ++ test.cpp other.cpp

В основном extern используется, чтобы компилятор связывал внешнюю переменную в другом объектном файле.Это может быть другой исходный файл или даже внешняя библиотека.Это также работает только для глобалов.

...