4

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

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

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

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

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

4

4 回答 4

8

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

  • extern在标题中声明它。一个符号可以被声明任意次数。
  • 在实现中定义它,只有一次。
于 2009-03-13T12:55:40.113 回答
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;
    }
    
于 2009-03-13T12:56:02.767 回答
0

像这样写你的头文件

#ifndef HEADER_FILE_NAME_H

#define HEADER_FILE_NAME_H

// 你的头文件代码

#万一

这将确保它不会被多次声明

于 2009-03-13T12:58:28.093 回答
0

在预处理器条件中包装头文件 (.h) 以防止它们被两次包含在编译器的符号表中:

#ifndef HEADER_NAME
#define HEADER_NAME
// code...
#endif//HEADER_NAME

HEADER_NAME 实际上可以是任何东西,但最好确保它与文件相关以防止更多冲突,因为这只是定义一个空的预处理器宏(也最终在符号表中)。

于 2009-03-13T13:02:03.827 回答