У меня есть переменная, которую я пытаюсь использовать в исходном файле C++ под названием Spiral.cpp
. Переменная была объявлена в файле заголовка, используя следующий код:
struct DataMessage{
...
::CORBA::Double radius;
...
};
внутри:
namespace STEERDataIDL{
...
}
Затем ему было присвоено значение в другом исходном файле Module.cpp
, используя следующую строку:
radius = Interface.spiralRadius;
внутри case STEERDataIDL::SpiralPattern:
функции:
void Module::FormList(void){
...
switch (this->InterCDNUSteerData.SteerMode)
{
....
}
}
Как видно из приведенной выше строки, значение, данное переменной здесь, было взято из пользовательского ввода в графическом интерфейсе.
Как уже упоминалось, я пытаюсь использовать эту переменную в функции в исходном файле Spiral.cpp
:
void Module::FormList(); /*This is the function in which 'radius' was given its value */
if(abs(someDistance) < (Data.radius + x)){
// Do XYZ
}
Тем не менее, я получаю несколько ошибок компиляции, которые я не понимаю:
error 'module' не является именем класса или пространства имен (на
void Module::
line)'x' необъявленный идентификатор
слева от '.radius' должен иметь класс /struct/union, type - "unkown type"
Может ли кто-нибудь объяснить мне, что я здесь делаю неправильно? Что мне нужно сделать, чтобы исправить эти ошибки компиляции?
Вы должны включить заголовочный файл, в котором объявлены данные, в этом случае декларация данных будет выглядеть примерно так:
//globals.h
#include "DataMessage.h"
extern DataMessage Data; //to indicate that Data will be created in a different cpp file and visible to other cpp files
Затем вы должны создать данные, созданные в файле cpp, который включает заголовочный файл, в котором была объявлена переменная Data, которая может выглядеть так:
//globals.cpp
#include "globals.h"
DataMessage Data;
теперь в Module.cpp у вас есть что-то вроде этого:
#include "globals.h"
...
void Module::FormList() {
Data.radius = Interface.spiralRadius; //notice how radius is accessible only through the Data variable
}
и в Spiral.cpp у вас должно быть что-то вроде этого:
#include "globals.h"
...
void Foo() {
if(abs(someDistance) < (Data.radius + x)) { //Data.radius is the same one across all files
// Do XYZ
}
}
extern DataMessage Data;
, Я получаю syntax error: missing ';' before 'Data'
... если я делаю extern struct DataMessage Data;
Я получаю, что local classes cannot be used to declare 'extern' variables
...
Здесь есть ряд проблем.
(struct DataMessage....)
в файле заголовка, но не объявляете сама переменнуюextern struct STEERDataIDL::DataMessage Data;
struct STEERDataIDL::DataMessage Data;
Важно то, что все extern
объявляются в области файлов. технически вы можете поместить extern struct STEERDataIDL::DataMessage Data;
непосредственно перед линией, в которой вы используете переменную, при условии, что она может правильно разрешить область.
::CORBA::Double radius;
? 2. Я пытался использовать extern struct DataMessage Data;
но получил ошибку компиляции, которая гласила, что «локальные классы не могут быть использованы для объявления переменных extern ... 3. В Module.cpp у меня есть строка: radius = Data.radius;
хотя, возможно, мне нужно объявить это с помощью строка extern struct DataMessage Data;
первая - 4. Ошибка копирования
#include
заголовок, в котором объявлена переменная / класс.