2015-05-28 3 views
1

У меня есть эта простая программа, которая пытается напечатать мою глобальную переменную в отдельном файле. Я использую Visual Studio 2013 профессиональный IDE.Как использовать глобальные переменные в нескольких файлах .cpp?

print.h

#ifndef PRINT_H_ 
#define PRINT_H_ 

void Print(); 

#endif 

print.cpp

#include "print.h" 

#include <iostream> 

void Print() 
{ 
    std::cout << g_x << '\n'; 
} 

source.cpp

#include <iostream> 
#include <limits> 

#include "print.h" 

extern int g_x = 5; 

int main() 
{ 
    Print(); 

    std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    std::cin.get(); 

    return 0; 
} 

Я получаю ошибку компиляции error C2065: 'g_x' : undeclared identifier.

Я искал этот форум и не смог найти кого-либо еще, имеющего мою проблему. Я попытался повторно объявить свою глобальную переменную в отдельном файле .cpp без успеха. Как вы можете видеть, я включил необходимые защитники заголовков и присвоил моей глобальной переменной ключевое слово extern. Это моя первая проверка глобальных переменных в нескольких файлах. Очевидно, я пропустил что-то простое. Что мне нужно изменить или добавить, чтобы моя программа работала?

EDIT: Я нашел это topic полезным при понимании разницы между внешним и глобальным значением.

+0

Вы могли бы хотеть смотреть на [это] (http://stackoverflow.com/questions/10422034/when-to- use-extern-in-c) – jaggedSpire

+0

@jaggedSpire Я прочитал вашу ссылку, но я все еще не уверен, что мне нужно изменить в своей программе. У меня есть «extern», и когда я переопределяю свою глобальную переменную в 'print.cpp', она все равно не будет компилироваться. – Bryan

+0

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

ответ

2

Компилятор компилирует print.cpp. Он ничего не знает о source.cpp во время компиляции print.cpp. Поэтому, что g_x, которое вы разместили в source.cpp, вам абсолютно не полезно, когда print.cpp скомпилируется, поэтому вы получаете ошибку.

То, что вы, вероятно, хотите сделать это

1) место extern int g_x; внутри print.h. Тогда компилятор увидит g_x при компиляции print.cpp.

2) в source.cpp, удалите extern из декларации g_x:

int g_x = 5; 
0
extern int g_x; 

принадлежит .h, и вам нужно добавить

int g_x =5; 

некоторые из .cpp.

2

Перемещайте глобальное объявление в общий заголовок, как common.h:

#ifndef COMMON_H_ 
#define COMMON_H_ 

extern int g_x; //tells the compiler that g_x exists somewhere 

#endif 

print.cpp:

#include <iostream> 

#include "print.h" 
#include "common.h" 

void Print() 
{ 
    std::cout << g_x << '\n'; 
} 

source.cpp:

#include <iostream> 
#include <limits> 

#include "print.h" 
#include "common.h" 

int g_x; 

int main() 
{ 
    g_x = 5; //initialize global var 
    Print(); 

    std::cin.clear(); 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    std::cin.get(); 

    return 0; 
} 

В других файлах .cpp вы можете получить доступ к g_x, включая заголовок common.h.

+0

Почему вы перенесли инициализацию в 'main'? –

+0

@JosEduSol Мне было интересно то же самое? Если вы инициализируете его в 'main()', не означает ли это * имя hide * или * shadow * глобальную переменную? – Bryan

+0

@ Странно, я подозреваю, что он не скрывает его, так как вы не объявляете переменную там. Однако вам не нужно это делать. Простое определение его в файле .cpp в глобальной области действия должно работать достаточно хорошо. – jaggedSpire

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