Как использовать глобальные переменные в нескольких файлах .cpp?

У меня есть эта простая программа, которая пытается напечатать мою глобальную переменную в отдельном файле. Я использую 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 и определением глобальной переменной.

1

Решение

Компилятор компилирует 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;
3

Другие решения

Переместите вашу глобальную декларацию в общий заголовок, например 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 заголовок.

2

extern int g_x;

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

int g_x =5;

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

0
По вопросам рекламы [email protected]