问题 从C到C ++的常量结构中的char数组的静态初始化


我在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不同?


10693
2017-10-04 09:43


起源

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


答案:


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

因此,您需要使用C89样式,C ++也支持该样式。由于结构只有这两个字段:

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

参考: 指定的初始化器


14
2017-10-04 09:47



所以缺点是如果库结构发生变化,我们会在错误的位置得到错误的数据。请注意,如果他们改变了这个定义,那么无论如何它都可能“打破世界”。 :-P - Joe
@Joe:这是POSIX规范的标准接口。它没有改变40年左右,如果不让天空坍塌就无法改变。在这个特殊情况下,我绝对不会担心。 - Jan Hudec