C++ POD结构是否可以在C+中以可移植的方式使用命名属性初始化+;?

C++ POD结构是否可以在C+中以可移植的方式使用命名属性初始化+;?,c++,gcc,portability,clang,C++,Gcc,Portability,Clang,我正在尝试使用命名属性初始化结构,其方式与GCC4.3.4和Clang2.9兼容 struct A { unsigned int x; }; // GCC: error: expected primary-expression before '.' token A a = { .x = 0xdeadbeef; }; // Clang: error: use of GNU old-style field designator extension [-Werror,-Wgnu-desig

我正在尝试使用命名属性初始化结构,其方式与GCC4.3.4和Clang2.9兼容

struct A {
  unsigned int x;
};

// GCC: error: expected primary-expression before '.' token
A a = {
  .x = 0xdeadbeef;
};

// Clang: error: use of GNU old-style field designator extension [-Werror,-Wgnu-designator]
A a = {
  x : 0xdeadbeef;
};
我无法将-Wno gnu指示符添加到CXXFLAGS中,因为GCC将拒绝构建,因为它不知道该标志。我不能在不命名属性的情况下使用初始化列表,因为如果API发生更改,我们将遇到严重问题


我需要的解决方案必须符合C++标准,同时保留这样一个事实,即如果新的属性出现在结构中,它们应该是未初始化的(或者最好是空的)。结构是第三方的,我不能以任何方式修改它们。

不,您不能命名这些值,只需按顺序排列即可

A a = { 42 };

如果在结构的末尾添加新字段,它们将被归零。

您可以这样做:

#if THIS_IS_GCC
  #define INIT_ATTR(x,y) x : y;
#elif THIS_IS_LLVM
  #define INIT_ATTR(x,y) .x=y;
#else
  #error Can't do it :/
#endif

A a = {
  INIT_ATTR(x,0xdeadbeef)
};

但是这不是标准的C++。 有什么问题吗

A a;
a.x = y;

遗憾的是,供应商不能保证他们会在最后添加它们。@DavidHolm:这就是为什么您需要一个适当的版本控制系统。您可以通过编写函数
a make_a(unsigned int x){a a a={0};a.x=x;返回a;}
来处理订单问题。现在您可以移植地编写
aa=make_A(0xdeadbeef),如果供应商在
x
之前添加了一个成员,则初始化为零。然后,您可以将其添加到
make_A
,作为末尾的默认参数,因此参数的顺序是它们添加的顺序,而不是结构中的顺序。但是,您不再按请求使用初始化器表达式中的命名成员,所以我不知道这是否可以接受。我不确定针对两个特定版本的特定工具链的计数是否为“便携”。“我需要的解决方案必须符合C++标准”——这是一个问题,因为这都不是标准C++。C++03没有命名成员的初始化,GCC 4.3.4也没有太多的C++0x。它也不是标准英语。@DavidHolm你抱怨说你想要的代码是跨编译器兼容的,符合标准的,并且现在足够干净,其他人会喜欢它。我很抱歉,伙计,你需要安排你的优先事项。有时并非所有约束都能同时满足。这就是生活。