我正在尝试在单独的文件中正确声明和定义全局变量,并将它们包含在处理类声明的第三个文件中。
这三个文件是:
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)我相信我缺少一些东西。请提出解决此问题的最佳方法。我正在使用codeblocks
和C++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
)的值。这是好的编程实践吗?
是的,如果要在需要编译时常量的地方使用它们。