C++98 如何在 header 中初始化静态结构数组

标签 c++ arrays struct initialization

[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/

相关文章:

c++ - 什么相当于 Kotlin 上的 C++ 指针?

c++ - 更高效地写入硬盘

Python - 在满足多个条件的NumPy数组中选择行

php - 复选框、表单提交以及如何在循环中正确使用 array_fill?

检查元素是否存在于C中的结构中

c++ - 返回节点指针的函数

C++ char 数组与数组进行比较并分配单独的值;

c++ - 为什么缺少/未声明 MonitorFromWindow? (C++/WinAPI)

javascript - 将数组的每个元素放在由 Javascript 创建的表格的单元格中

c - 我的结构数组的大小不同......为什么?