【问题标题】:C++98 how to initialise static struct array in headerC ++ 98如何在标题中初始化静态结构数组
【发布时间】:2017-10-02 13:34:47
【问题描述】:

[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(包含在另一个标题中)

该库提供了一个预定义的 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) )
};

如何为结构数组创建构造函数,我将在我的代码中的哪个位置执行此操作? (另外,我不想在这里使用向量。)

【问题讨论】:

  • 你能提供一个可重现的minimal reproducible example吗?它编译时添加了一些缺失的部分here
  • 在这里阅读 Howard Hinnant 的回答:stackoverflow.com/questions/15708411/…
  • @NathanOliver:谢谢,这不是我所期望的。我的代码中唯一的区别是 main、BodyPoint 和 Point3D 位于单独的文件中,并且我使用的是 XCode 9 的 Clang++ 版本。该命令包括标志:-fblocks -O2 -std=c++11 -stdlib=libc++ -Werror -Weverything -Wno-unknown-pragmas -Wno-weak-vtables -Wno-padded -Wno-unused-variable -Wno-unknown-warning-option -Wno-reserved-id-macro(顺便设置了 C++11,而不是 98)。 [我们的构建设置了这些标志,包括 C++11,但最终出于交叉编译的原因,我需要编写代码以符合 C++03 或更早的标准。]
  • @ChrisUzdavinis:我已经看过那个例子了,虽然我不明白应该如何实现使用类引用和构造函数主体的解决方案,但它看起来不适用于我使用结构和数组时的情况。我不想在结构中添加更多属性,也不想将其包装到父类中。
  • @gone 看起来警告是因为你有一个全局对象。如果您要使用全局数组,您应该关闭警告。或者您可以使用自己的std::array 并使用霍华德的解决方法。

标签: c++ arrays struct initialization


【解决方案1】:

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

这本身不是问题,尽管全局初始化的顺序可能会因跨翻译单元依赖而产生问题,并且它们会减慢程序的启动速度。

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

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

【讨论】:

  • 根据我上面的第三条评论。本地数据结构的初始化将在函数体中执行吗?另一个问题是我需要调用该函数来获取引用。
  • 如果你创建了一个返回静态本地数据的函数,那么可以。仅在第一次通话时。但是虽然这是懒惰的(如果你不使用它,你就不会构造它),它也意味着它可能在不方便的时候被构造出来。懒惰的建设总是这样,尽管在这种情况下可能没什么大不了的。
猜你喜欢
  • 2011-02-08
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 2023-04-05
  • 2021-01-31
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
相关资源
最近更新 更多