C ++ 98如何在标题

时间:2017-10-02 13:34:47

标签: c++ arrays struct initialization

[OSX 10.12.6,LLVM Clang ++ 9.0]

我需要将用C ++ 11编写的库(使用初始化列表)转换为C ++ 03格式(或更早版本)。该库是3D模型的仅标题实现。在库中,我有一个包含许多属性的结构,这些属性本身就是自定义类。

struct BodyPoint {
    BodyPoints          name;
    Point3D<double>     orientation;
    Point3D<double>     offset;

    BodyPoint() {}
    BodyPoint(BodyPoints _name, Point3D<double> _orientation, Point3D<double> _offset):
    name(_name), orientation(_orientation), offset(_offset) {}
};

1)BodyPoints是一个typedef enum BodyPoints,它列举了我正在控制的对象的兴趣点。 (在此库中声明)
2)Point3D&lt; double&gt; (包含在其他标题中)

该库提供了一个预定义的BodyPoints数组,它对使用它的模块是全局的。

因此,在声明struct之后,我声明了一个数组变量。但是,我收到错误declaration requires a global constructor [-Werror,-Wglobal-constructors]

我的数组声明如下:

static BodyPoint bodyPoints[2] =
{
  BodyPoint(bWorld,Point3D<double>(0.0,0.0,0.0), Point3D<double>(0.00,0.00,0.00) ),
  BodyPoint(bHead, Point3D<double>(0.0,0.0,0.0), Point3D<double>(0.00,0.00,0.00) )
};

如何为结构数组创建构造函数,在我的代码中我会这样做? (另外,我不想在这里使用向量。)

1 个答案:

答案 0 :(得分:0)

警告并不意味着您必须添加全局构造函数,这意味着您在初始化全局变量时声明需要构造函数调用的全局变量。编译器只是在整个程序初始化之前,在main()之前警告它们正在该上下文中运行。

这本身并不是问题,但全局初始化的顺序可能会出现交叉翻译单元依赖性问题,并且可能会减慢程序的启动速度。

您可以禁用警告-Wno-global-constructors。

另一个建议是创建一个返回静态本地数据的函数。