【问题标题】:static initialisation of a char array in a constant struct from C to C++从 C 到 C++ 的常量结构中的 char 数组的静态初始化
【发布时间】:2013-10-11 06:27:20
【问题描述】:

我有一些现有的 C 代码:

extern const struct sockaddr_un addr =
{
    .sun_family = AF_UNIX,
    .sun_path   = "myreallylongpath"
};

其中 sun_path 是一个字符数组。

这曾经在旧版本的 GCC 中编译为 C。我现在已将其转换为 C++ 并使用 GCC v4.7.2。我不断收到错误:

“C99 指示符 'sun_path' 外部聚合初始化程序”

难道我在 C++ 中不能做我正在做的事情,还是语法与旧 C 不同?

【问题讨论】:

  • 如果要将整个代码转换为 C++,请考虑将构造函数添加到 sockaddr_un 并使用它来创建实例。
  • @NeilKirk:这是来自标准 POSIX C API 的结构。你不能向它添加构造函数(好吧,你可以添加一个命名的构造函数,但我认为这没有多大意义)。

标签: c++ c gcc struct initialization


【解决方案1】:

指定初始化器是在 C99 中引入的,GCC 也支持它们作为 GNU89 中的扩展,但在 C++ 中不支持。

所以你需要使用 C89 风格,C++ 也支持这种风格。由于结构只有这两个字段:

extern const struct sockaddr_un addr =
{
    AF_UNIX,
    "myreallylongpath"
};

参考:Designated Initializers

【讨论】:

  • 因此不利的一面是,如果该库结构发生更改,我们会在错误的位置获得错误的数据。请注意,如果他们改变这个定义,无论如何它可能会“打破世界”。 :-P
  • @Joe:这是 POSIX 规范的标准接口。四十多年没有改变,也改变不了天不塌下来。在这种特殊情况下,我绝对不会担心。
  • Since the struct has only these two fields 是错误的假设。在我的例子中,我的结构有十几个字段,其中只设置了四个。这个答案没有解释在将 C 代码转换为 C++ 时在这种情况下该怎么做。
猜你喜欢
  • 2011-06-04
  • 2012-08-18
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2019-03-25
相关资源
最近更新 更多