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

时间:2009-03-13 12:52:25

标签: c++ global-variables constants

我在一个名为“Matrix.h”的标题中定义了一个模板矩阵类。

我的程序中会反复使用某些矩阵。我想我会在“Matrix.h”头文件中定义它们,如下所示:

const Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);

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

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

4 个答案:

答案 0 :(得分:8)

你可以通过以下方式避免它:

  • 在标题中声明extern。符号可以被声明任意次。
  • 仅在实施中定义一次。

答案 1 :(得分:6)

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

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

    static Matrix<GLfloat> B_SPLINE_TO_BEZIER_MATRIX(4, 4, values);
    
  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;
    }
    

答案 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可以做任何事情,但最好确保它与文件有关,以防止更多的冲突,因为这只是定义一个空的预处理器宏(也最终在符号表中)。