[OSX 10.12.6, LLVM Clang++ 9.0]
我需要将用 C++11(使用初始化列表)编写的库转换为 C++03 形式(或更早版本)。该库是 3D 模型的仅 header 实现。在库中,我有一个包含许多属性的结构,这些属性本身就是自定义类。
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
该库提供了一个预定义的 BodyPoints 数组,该数组对于使用它的模块是全局的。
因此,在声明结构之后,我声明了一个数组变量。但是,我收到错误 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) )
};
如何为结构数组创建构造函数,我应该在代码中的什么位置创建构造函数? (另外,我不想在这里使用 vector 。)
最佳答案
警告并不意味着您必须添加全局构造函数,它意味着您在初始化全局变量时声明需要调用构造函数的全局变量。编译器只是警告它们正在该上下文中运行,在 main() 之前,在整个程序初始化之前。
这本身不是问题,尽管全局初始化的顺序可能会导致跨翻译单元依赖性出现问题,并且它们会减慢程序的启动速度。
您可以禁用警告 -Wno-global-constructors。
另一个建议是制作一个返回静态本地数据的函数。
关于C++98 如何在 header 中初始化静态结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46526551/