0

我正在编写一个库,用户可以在其中定义任意结构并将它们传递给我的库,然后它将从静态成员中获取结构的内存布局,这种结构必须具有作为惯例。

例如:

struct CubeVertex {
  // This is, per convention, required in each structure to describe itself
  static const VertexElement Elements[];

  float x, y, z;
  float u, v;
};

const VertexElement CubeVertex::Elements[] = {
  VertexElement("Position", VertexElementType::Float3),
  VertexElement("TextureCoordinates", VertexElementType::Float2),
};

C++ 最佳实践建议我将静态变量及其初始化移动到我的源 (.cpp) 文件中。然而,我希望变量初始化尽可能接近结构,因为每当结构发生变化时,变量也必须更新。

是否有一种可移植的(至少 = MSVC + GCC)方法在头文件中声明这样的变量,而不会导致链接器出现模棱两可的符号/重新定义错误?

4

2 回答 2

3

您可以在这里做的是使用匿名命名空间。

将所有内容包装到“namespace { ... };”中 然后您可以像往常一样访问 CubeVertex::Elements。

但是,每次包含头文件时都会创建一个静态数据的新实例,这会增加可执行文件的文件大小。

它对如何使用类/结构也有一些限制,因为您不能从另一个文件调用该类的函数(在这种特殊情况下这不会成为问题)。

于 2012-07-05T12:58:44.740 回答
3

Consider a simple getter.

struct CubeVertex {
    static const std::array<VertexElement, N>& GetElements() {
         static const std::array<VertexElement, N> result = {
             //..
         };
         return result;
    }
    //..
}

Immediate benefit: No array-to-pointer-decay.

于 2012-07-05T13:12:36.680 回答