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

| 我正在尝试以一种与GCC 4.3.4和Clang 2.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;
};
我不能在CXXFLAGS中添加-Wno-gnu-ator,因为GCC不知道该标志,因此它将拒绝构建。我不能在没有命名属性的情况下使用初始化列表,因为如果API发生更改,我们将遇到严重的问题。 我需要的解决方案必须符合C ++标准,同时保留以下事实:如果新属性出现在结构中,则应将其未初始化(最好是NULL)。这些结构是第三方,我无法以任何方式更改它们。
已邀请:
不,您不能命名值,只能按顺序给它们命名。
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;

要回复问题请先登录注册