2012-03-12 6 views
2

У меня есть файл заголовка abc.h, в котором я хочу определить константу с внешней связью. Таким образом, он содержит заявлениеextern const in C++

--------------- abc.h ----------------------- -

extern const int ONE = 1; 

Далее у меня есть main.cpp, где я хочу использовать значение ONE. Таким образом, я объявляю ONE в main.cpp перед его использованием как

--------------- main.cpp --------------- ------

extern const int ONE; 
int main() 
{ 
    cout << ONE << endl; 
} 

Я получаю сообщение об ошибке «Несколько определений ONE».

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

Я удалил #include "abc.h" из main.cpp, и все работает.

г ++ abc.h main.cpp -o Основной

адрес одного это то же самое в заголовке и основной. Так оно и работает.

Но я не понимаю, как компилятор разрешает определение ONE без включать заявление в main.cpp

Похоже, что г ++ делает некоторые магии. Это плохая практика, когда читатель main.cpp не знает, где объявляется ONE, поскольку в main.cpp нет «abc.h»?

+0

Что 'first'? –

+0

мой плохой, удаленный первый – Jimm

+0

У вас есть 'extern' в обоих местах? (Код, который у вас выше, скомпилирован для меня). Кроме того, проверьте [Mixing extern и const] (http://stackoverflow.com/questions/2190919/mixing-extern-and-const). –

ответ

-1

как я могу объявить константный с внешним связыванием, и использовать его впоследствии в разных файлах,

По умолчаниюнормальной переменного или типа обладает внешним связыванием, при условии, что у вас есть заявлено в области namespace и не является static.

Просто определите переменную как:

// abc.h 
const int ONE = 1; // not "extern" 

ONE должна быть определена где-то.
Для вашего конкретного примера вы можете просто #include"abc.h" внутри main.cpp после удаления «extern» и он будет работать.
Помните, что const int в файле заголовка не приведет к ошибке множественного определения связи из-за его «константы», даже если заголовочный файл включен в несколько файлов .cpp.

+0

По умолчанию const имеет внутреннюю привязку, даже если вы объявляете ее на уровне файла – Jimm

+0

@Jimm, я редактировал ответ, пока ваш комментарий пришел :) – iammilind

+2

Теперь ответ не имеет никакого смысла. Вы начинаете с «просто сделайте это ...», затем закончите с «но на самом деле, это совсем не то, что вы просите». –

8

abc.h:

extern const int ONE; 

а.каст:

#include "abc.h" 

const int ONE = 1; 

main.cpp:

#include "abc.h" 

int main() { 
    cout << ONE << endl; 
} 
+0

интересно отметить, что декларация extern должна быть сделана в той же самой системе переводов, что и переменная. в этом примере вы фактически объявляете его extern const сначала, а затем определяете его в том же файле. это не требуется для неконстантных переменных (просто определите их и у них есть внешняя связь). – tstittleburg

+0

альтернативно, 'abc.cpp' может содержать только одну строку' extern const int ONE = 1; 'Для получения дополнительной информации см. C++ Primer 5th edition , п. 60. –

+0

@YiboYang Как бы main.cpp получить доступ к ONE? Кроме того, не предполагайте, что у всех есть те же книги, что и вы, и когда вы ссылаетесь на что-то, попробуйте убедиться, что к нему можно получить доступ в режиме онлайн и бесплатно. –

Смежные вопросы