我有一个名为"Matrix.h"的标题中定义的模板矩阵类类.
在我的程序中反复使用某些矩阵.我以为我会在"Matrix.h"头文件中定义这些,如下所示:
const MatrixB_SPLINE_TO_BEZIER_MATRIX(4, 4, values);
当我这样做时,g ++抱怨我重新定义了有问题的常量.发生这种情况是因为我将Matrix.h包含在两个不同的源文件中.当编译这些文件的目标文件时,两者最终都会得到上面矩阵的定义,从而导致出现错误消息.
我的问题是如何避免这种情况?我想要一个可以访问多个文件的常量,但我不知道在哪里放置它.
你避免它:
extern
在标题中声明它.符号可以被声明任意次.
在实现中定义它,只有一次.
如果您不想在标头和实现文件之间拆分它,
声明您的常量static
(或在匿名命名空间中声明它)以使定义成为私有.链接器不会抱怨,但它会在编译单元之间产生多个私有副本.
static MatrixB_SPLINE_TO_BEZIER_MATRIX(4, 4, values);
创建一个返回常量的内联函数.内联函数定义在目标文件中生成"弱"符号,因此链接器将消除重复并选择一个.
inline const Matrix& GET_B_SPLINE_TO_BEZIER_MATRIX() { const static Matrix B_SPLINE_TO_BEZIER_MATRIX(4, 4, values); return B_SPLINE_TO_BEZIER_MATRIX; }