2016-01-25 2 views
0

Так что у меня возникла проблема с объявлением глобальной переменной (в заголовке) и ее использованием. Я прочитал несколько файлов заголовков и как они работают, но я не понимаю, почему мой код не работает.Проблема с заголовками и глобальной переменной

Вот что у меня есть (в упрощенном виде):

Главная:

// main.cpp 

#include "source.hpp" 

int main() 
{ 
    return variable; 
} 

Источник:

// source.cpp 

#include "source.hpp" 

variable = 17; 

Заголовок:

// source.hpp 

#ifndef __SOURCE_HPP_INCLUDED__ 
#define __SOURCE_HPP_INCLUDED__ 

extern int variable; 

#endif // __SOURCE_HPP_INCLUDED__ 

Я пробовал с extern в файле заголовка. Я получаю эту ошибку при попытке (скомпилировать в источнике): 'variable' не называет тип Что я не понимаю правильно?

Кроме того, когда я объявляю ту же переменную в main.cpp, компилятор отбрасывает ошибку об «переопределении» переменной. Почему это?

+2

Имена, которые содержат два последовательных символов подчеркивания ('__SOURCE_HPP_INCLUDED__') и имена, которые начинаются с символа подчеркивания последующим прописной буквы зарезервированы к реализация. Не используйте их. –

+0

Возможный дубликат [Что такое неопределенная ссылка/неразрешенная ошибка внешнего символа и как ее исправить?] (Http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external- symbol-error-and-how-do-i-fix) – IInspectable

ответ

2

В source.cpp вам нужно определить переменная:

int variable = 17; 
+0

Это решило! Так верно, что мне всегда нужно переопределить переменную где-то еще (например, источник), хотя я уже определил ее в заголовке? –

+3

@MaxJacob: 'extern int i;' является ** объявлением **, 'int i;' является определением. В C++ есть правило с одним определением. Вы не можете определить символ более одного раза. – IInspectable

+0

Это имеет смысл. Спасибо за пояснение! –