2016-05-13 3 views
0

У меня есть три файла, один из которых имеет доступ к переменным, а еще два, которым необходимо получить доступ к этим переменным. На данный момент у меня есть три файла, как показано ниже, и получение ошибки в компиляции, в которой указано неопределенное обращение к i. Я не могу понять, почему использование пространства имен дает ошибку?Как получить доступ к переменной из включенного файла заголовка

header.h

extern int i; 

a.cpp

#include "header.h" 
#include "mheader.h" 
namespace s{ 
    int i=10; 
    struct p{ 
    p(){ 

    } 
    }; 
} 

b.cpp

#include "a.cpp" 
int main(){ 
    cout<<i; 
} 

даже если я определить определить переменную я перед началом объявления пространства имен не доступное внутри пространства имен. Есть ли способ получить доступ к переменной внутри пространства имен, а также в b?

+3

'i' и' s :: i' не то же самое, они не имеют значения. – songyuanyao

+0

, даже если я определяю его перед запуском объявления пространства имен, он недоступен в пространстве имен. Есть ли способ получить доступ к переменной внутри пространства имен, а также в b? –

+0

И почему вы '# include' CPP-файл? – Ajay

ответ

1

Вы можете исправить это таким образом.

header.h

namespace s 
{  
extern int i; 
} 

b.cpp

#include "a.cpp" 
    int main() 
    { 
     cout<<s::i; 
    } 

Но вам лучше понять это хорошо!

+0

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

+2

. : Вы поместили файл в 'C: \ abc \ file.txt', но вы пытаетесь прочитать файл как' c: \ file.txt'. Рассмотрите 'extern' как shortcut к файлу' c: \ file.txt', который не существует. – Ajay

2

Пространства имен - это отдельные пространства для имен. Имя в одном пространстве имен относится к совершенно другой переменной (или типу или чем-либо другому), чем имя в другом пространстве имен, если не указано иное.

extern int i объявлен в глобальном пространстве имен (полное имя ::i) является другим переменным, чем int i, определенным в пространстве имен s (полное имя s::i).

Таким образом, вы никогда не определено ::i, что вы объявили в header.h и используется в b.cpp

Есть два возможных решения, в зависимости от того, что ваше намерение. Вы можете определить int i в глобальном пространстве имен либо в файле a.cpp или b.cpp. В этом случае вы можете избавиться от s::i, который, по-видимому, нигде не используется.

Или вы можете использовать s::i в b.cpp. В этом случае вы можете избавиться от объявления ::i, которое больше не будет использоваться нигде.

В качестве побочного элемента, включая a.cpp, скорее всего, является ошибкой. Если вы попытаетесь связать файлы объектов, скомпилированные как из файлов a.cpp, так и из b.cpp, вы нарушите одно правило определения.

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