我在一个名为“Matrix.h”的标题中定义了一个模板矩阵类。
我的程序中会反复使用某些矩阵。我想我会在“Matrix.h”头文件中定义它们,如下所示:
const Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);
当我这样做时,g ++抱怨我重新定义了有问题的常量。发生这种情况是因为我将Matrix.h包含在两个不同的源文件中。当编译这些文件的目标文件时,两者最终都会得到上面矩阵的定义,从而导致出现错误信息。
我的问题是如何避免这种情况?我想要一个可以访问多个文件的常量,但我不知道在哪里放它。
答案 0 :(得分:8)
你可以通过以下方式避免它:
extern
。符号可以被声明任意次。答案 1 :(得分:6)
如果您不想在标题和实现文件之间拆分,
声明您的常量static
(或在匿名命名空间中声明它)以使定义成为私有。链接器不会抱怨,但会在编译单元之间产生多个私有副本。
static Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);
创建一个返回常量的内联函数。内联函数定义在目标文件中生成“弱”符号,因此链接器将消除重复并选择一个。
inline const Matrix<GLfloat>&
GET_B_SPLINE_TO_BEZIER_MATRIX() {
const static Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);
return B_SPLINE_TO_BEZIER_MATRIX;
}
答案 2 :(得分:0)
只需像这样编写你的头文件
#ifndef HEADER_FILE_NAME_H
#define HEADER_FILE_NAME_H
//您的头文件代码
#ENDIF
这将确保它不会多次声明
答案 3 :(得分:0)
在预处理程序条件中包装头文件(.h),以防止它们被包含在编译器的符号表中两次:
#ifndef HEADER_NAME
#define HEADER_NAME
// code...
#endif//HEADER_NAME
HEADER_NAME可以做任何事情,但最好确保它与文件有关,以防止更多的冲突,因为这只是定义一个空的预处理器宏(也最终在符号表中)。