C++ - 在以下情况下,为什么我必须包含.cpp文件以及/而不是.h文件才能访问全局变量的值?



我正在尝试在单独的文件中正确声明和定义全局变量,并将它们包含在处理类声明的第三个文件中。

这三个文件是:

1)global.h

#ifndef GLOBAL_H_INCLUDED
#define GLOBAL_H_INCLUDED
extern const int marker_num;
extern const int dim;
using namespace std;
#endif // GLOBAL_H_INCLUDED

2)global.cpp

#include <iostream>
#include <cstdio>
#include <cmath>
#include "global.h"
#include "WorldState.h"
#include "Robot.h"
#include "Sensor.h"
#include "Marker.h"   
constexpr const int marker_num = 10;
constexpr const int dim = (2 * marker_num) + 3;

3)WorldState.h

#ifndef WORLDSTATE_H
#define WORLDSTATE_H
#include "global.h"
#include "global.cpp"
class WorldState{
public:
WorldState(float a[], float b[dim][dim]);
get_wstate();
protected:
private:
float w_state[];
float covar_matrix[dim][dim];    
};
#endif // WORLDSTATE_H

我正在使用全局变量dim来声明和定义一个多维数组。我已经在global.h内部声明了dim,并在global.cpp中定义了它。现在,我有一个名为WorldState的类,在其标头中,我正在使用dim.如果我注释掉#include "global.cpp",它会抛出以下错误:

C:UserssyampDocumentscodeblocksslamWorldState.h|10|error: array bound is not an integer constant before ']' token

我的理解是,包括.h文件也包括相应的.cpp,所有声明都应该在.h内,所有定义都应该在.cpp内。但是,在这种情况下它似乎不起作用。

1)如果我决定在WorldState.h中包含global.cpp文件,这不是不好的编程实践吗?我正在尝试编写一个好的代码,而不仅仅是一个有效的代码。

2)另一种方法是定义global.h内部dim(和marker_num)变量的值。这是好的编程实践吗?

3)我相信我缺少一些东西。请提出解决此问题的最佳方法。我正在使用codeblocksC++11.提前谢谢。

我正在使用全局变量dim来声明和定义一个多维数组。

在编译时声明固定长度数组时,编译器必须知道其维度的值,但分离会阻止编译器知道dim的值,因此dim不能用于指定固定数组维度。 任何使用dim的代码都将编译为对它的引用,然后链接器将在编译完成后解析引用。仅仅因为dim被声明为const并不能使其适合作为编译时常量。 为此,您必须在其声明中定义其值,例如:

#ifndef GLOBAL_H_INCLUDED
#define GLOBAL_H_INCLUDED
static constexpr const int marker_num = 10;
static constexpr const int dim = (2 * marker_num);
using namespace std;
#endif // GLOBAL_H_INCLUDED

否则,如果将dim的声明和定义保存在单独的文件中,则必须在运行时动态分配数组,而不是在编译时静态分配数组。

我已经在global.h内部声明了dim,并在global.cpp内部对其进行了定义。

这对于在运行时之前不需要使用的值来说很好。 这不适用于编译时需要使用的值。

我的理解是,包括.h文件也包括相应的.cpp

这甚至不是事实。项目/生成文件在调用编译器时引入.cpp文件。.h文件与此无关。

所有声明都应在.h内,所有定义都应在.cpp内。

通常是的,但并非总是如此。

如果我决定在WorldState.h中包含global.cpp文件,这不是不好的编程实践吗?

是的。

另一种方法是在global.h内部定义变量dim(和marker_num)的值。这是好的编程实践吗?

是的,如果要在需要编译时常量的地方使用它们。

相关内容

  • 没有找到相关文章

最新更新