English 中文(简体)
一个怎样才能避免在C++中无意中重新声明全局常量?
原标题:
  • 时间:2009-03-13 12:52:24
  •  标签:

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

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

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

当我这样做时,g++抱怨我重新定义了相关的常量。这是因为我将Matrix.h包含在两个不同的源文件中。当编译这些目标文件时,两者都会得到上述矩阵的定义,从而导致错误消息。

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

最佳回答

如果您不想将其拆分为头文件和实现文件,

  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;
    }
    
问题回答

你通过以下方式避免它:

  • Declaring it extern in the header. A symbol can be declared any number of times.
  • Defining it in the implementation, only once.

只需按照这样编写您的头文件

#ifndef HEADER_FILE_NAME_H

#define HEADER_FILE_NAME_H -> #定义头文件名称_H

你的头文件代码

# endif

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

将头文件(.h)包裹在预处理器条件语句中,以防止它们被编译器的符号表重复包含:

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

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





相关问题
热门标签