У меня есть эта простая программа, которая пытается напечатать мою глобальную переменную в отдельном файле. Я использую Visual Studio 2013 профессиональный IDE.
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. Я впервые тестирую глобальные переменные в нескольких файлах. Очевидно, я упускаю что-то простое. Что мне нужно изменить или добавить, чтобы моя программа работала?
РЕДАКТИРОВАТЬ: я нашел это тема полезно понимать разницу между extern и определением глобальной переменной.
Компилятор компилирует 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;
Переместите вашу глобальную декларацию в общий заголовок, например 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 заголовок.
extern int g_x;
принадлежит .h, и вам нужно добавить
int g_x =5;
к некоторым из .cpp.