C ++访问从另一个源文件在一个源文件中声明/定义的变量

时间:2014-11-18 15:15:55

标签: c++ compiler-errors

我有一个我想在名为Spiral.cpp的C ++源文件中使用的变量。已使用以下代码在头文件中声明该变量:

struct DataMessage{
    ...
    ::CORBA::Double radius;
    ...
};

namespace STEERDataIDL{
    ...
}

然后使用以下行在另一个名为Module.cpp的源文件中给出了一个值:

radius = Interface.spiralRadius;

case STEERDataIDL::SpiralPattern:

的功能:

void Module::FormList(void){
    ...
    switch (this->InterCDNUSteerData.SteerMode)
{
          ....
      }
}

如上面一行所示,这里给变量的值取自GUI上的用户输入。

如上所述,我正在尝试在我的Spiral.cpp源文件中的函数中使用此变量:

void Module::FormList(); /*This is the function in which `radius` was given its value */
if(abs(someDistance) < (Data.radius + x)){
    // Do XYZ
}

但是,我收到了一些我不理解的编译错误:

  

错误&#39;模块&#39;不是类或命名空间名称(在void Module::行上)

     
    

&#39; X&#39;未声明的标识符

         
      离开&#39; .radius&#39;必须有class / struct / union,type是&#34; unkown type&#34;

    
  

有谁可以向我解释我在这里做错了什么?我需要做些什么来解决这些编译错误?

2 个答案:

答案 0 :(得分:0)

这里有很多问题。

  1. 您在头文件中定义变量TYPE (struct DataMessage....)但不自行声明变量
  2. 无法在头文件中定义变量,仅在命名空间之外的外部引用中声明。
    extern struct STEERDataIDL::DataMessage Data;
  3. 在Module.cpp中的
  4. ,即使你试图在Spiral.cpp中访问它,你似乎也没有在任何地方引用一个名为“Data”的类型为struct DataMessage的变量
    struct STEERDataIDL::DataMessage Data;
  5. 您在Spiral.cpp
  6. 中缺少右括号

    重要的是所有extern都在文件范围内声明。从技术上讲,您可以将extern struct STEERDataIDL::DataMessage Data;放在使用变量的行的前面,前提是它可以正确地解析范围。

答案 1 :(得分:0)

您必须包含声明Data的头文件,因此,Data的声明将如下所示:

//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
  }
}