如何避免在C++中意外重新声明全局常量?

flu*_*els 4 c++ constants global-variables

我有一个名为"Matrix.h"的标题中定义的模板矩阵类类.

在我的程序中反复使用某些矩阵.我以为我会在"Matrix.h"头文件中定义这些,如下所示:

const Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);
Run Code Online (Sandbox Code Playgroud)

当我这样做时,g ++抱怨我重新定义了有问题的常量.发生这种情况是因为我将Matrix.h包含在两个不同的源文件中.当编译这些文件的目标文件时,两者最终都会得到上面矩阵的定义,从而导致出现错误消息.

我的问题是如何避免这种情况?我想要一个可以访问多个文件的常量,但我不知道在哪里放置它.

unw*_*ind 8

你避免它:

  • extern在标题中声明它.符号可以被声明任意次.
  • 在实现中定义它,只有一次.


Ale*_*x B 6

如果您不想在标头和实现文件之间拆分它,

  1. 声明您的常量static(或在匿名命名空间中声明它)以使定义成为私有.链接器不会抱怨,但它会在编译单元之间产生多个私有副本.

    static Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个返回常量的内联函数.内联函数定义在目标文件中生成"弱"符号,因此链接器将消除重复并选择一个.

    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;
    }
    
    Run Code Online (Sandbox Code Playgroud)