глобальная переменная С++ не была объявлена ​​в этой области

Я новичок в С++. Я пытаюсь изменить очень сложный код видеокодека в рамках моего школьного проекта последнего года обучения. Это мой код:

Это заголовочный файл, в котором я объявил три внешних переменных: yuv.h

#include <vector>
namespace X265_NS 
{
extern int frameNumber;
extern int frameSize;
extern std::vector<int>numbers;

class YUVInput : public InputFile, public Thread
{
protected:

// some more variables

public:

// more variables and function declarations

};
}

Это первый файл, в котором используются эти внешние переменные: yuv.cpp.

#include "yuv.h"
//more includes
#include <vector>

using namespace X265_NS;
int frameNumber;
int frameSize;
std::vector<int>numbers;

// some stuff and function calls
// here I use my extern variables in a function

frameNumber = readCount.get();
frameSize = ceil((double)height / 32) * ceil((double)width / 32);

//more stuff

bool YUVInput::populateFrameQueue()
{
   if(read<1)
             {
                  ifstream file("/home/abu-bakr/bin/test.txt");
                  int number;
                  while (file >> number)
                           numbers.push_back(number);
             }
}

// more stuff

Это второй класс, в котором я использую эти внешние переменные:

анализ.cpp

#include "yuv.h"
#include <vector>
....
using namespace X265_NS;

// some stuff

// its in a function and only place where I am using these variables
int qp_ctu = numbers.at((ctu.m_cuAddr + 1) + (frameSize*(frameNumber - 1)));

// more stuff

Я хочу знать:

  • Это правильное место для объявления моих внешних переменных в файле yuv.h?
  • Если я определяю эти переменные в обоих файлах cpp, генерируется ошибка «уже определенная». Если я определяю их только в одном классе, в другом классе возникает ошибка «неразрешенный внешний символ».

person Muhammad Abu Bakr    schedule 26.03.2017    source источник


Ответы (1)


Проблема в вашем yuv.cpp

using namespace X265_NS;
int frameNumber;
int frameSize;

Эти определения относятся к ::frameNumber и ::frameSize, которые отличаются от X265_NS::frameNumber и X265_NS::frameSize.

Измените вышеуказанное на

namespace X265_NS {
    int frameNumber;
    int frameSize;
}

using namespace X265_NS;    // for subsequent code that uses those variables

or to

int X265_NS::frameNumber;
int X265_NS::frameSize;

using namespace X265_NS;    // for subsequent code that uses those variables
person Peter    schedule 26.03.2017
comment
Спасибо за ваш ответ. Все еще есть ошибки: как я могу определить вектор в моих файлах cpp, поскольку генерируется 1 неразрешенная ошибка внешней переменной. Во-вторых, как вы сказали мне, использовать вышеуказанное решение в последующих классах, которые используют эти переменные, но это создает уже определенную ошибку. В очередной раз благодарим за помощь - person Muhammad Abu Bakr; 26.03.2017
comment
Я не предлагал использовать приведенное выше решение в последующих классах, под которым я предполагаю, что вы имеете в виду, что вы реплицируете определение в нескольких единицах компиляции. В C++ существует правило одного определения. В данном случае это означает, что вы не можете определять свои переменные более одного раза ВО ВСЕЙ ПРОГРАММЕ. - person Peter; 26.03.2017
comment
Когда я только объявляю эти переменные в yuv.cpp и не объявляю эти переменные в анализе, возникает ошибка необъявленного идентификатора. Подскажите, пожалуйста, как определить вектор в файлах cpp. - person Muhammad Abu Bakr; 26.03.2017