2013-08-14 1 views
0

Зачем переменные необходимо выставлять при объявлении в заголовочном файле, а затем снова объявлять в соответствующем файле cpp:Ошибка внешнего и компоновщика

a. Предотвращение ошибки связи

ex. header 1.h- 
    namespace forglobal { 
    extern int x; 
    } 

    source 1.cpp- 
    namespace forglobal{ 
    int x=6; 
    } 

    source 2.cpp- 
    #include "1.h" 
    cout<<x; //6 

b. Использовать в разных файлах cpp, не могу ли я просто использовать пространство имен, например, я вызываю функцию ex.

header -1.h 
    namespace forglobal { 
    int x 
    } 

    source -1.cpp { 
    namespace forglobal { 
    void change() { 
    x=5; 
    } 
    } 
    } 

    source -2.cpp 
    #include "1.h" 
    forglobal::change(); 
    cout<<forglobal::x<<'\n'; //5 

ответ

1

Любое объявление переменной уровня пространства имен, которое не объявлено extern, также является определением. То есть, если у вас есть заголовок с объявлением переменной non extern, который включен в более чем одну единицу перевода, связанную с программой, вы получаете несколько определений. Чтобы этого избежать, вы помечаете объявление переменной в заголовке как extern и опускаете extern, где находится определение.

Конечно, использование глобальных переменных, как правило, является плохой идеей, но это другое обсуждение.

+0

, строго говоря, переменная пространства имен не является глобальной переменной. Но все они автоматически инициализировались. –

0

Во втором случае, вы выделения места для переменной х в двух местах, так что линкер не будет знать, как получить доступ к переменной. В первом выделяется только одно место, поэтому нет путаницы.

+0

Вы имеете в виду, когда я объявляю x в заголовке, а затем инициализирую его в исходном файле? –

+0

Я думаю, вам нужно понять, что такое декларация и какое определение. –

1

sЭтот вопрос связан с одной фундаментальной концепцией в C++, которая является одним правилом определения (ODR). Как сказал Dietmar Kühl, без «extern» у вас есть несколько определений той же переменной, которые будут нарушать ODR.

Однако на C++ у вас может быть как можно больше объявлений. В основном декларация вводит имя в область и определение выделяет некоторую память для переменной.

См. Книгу Bjarne Stroutstrup, «Язык программирования C++».