C++ POD结构是否可以在C+中以可移植的方式使用命名属性初始化+;?
我正在尝试使用命名属性初始化结构,其方式与GCC4.3.4和Clang2.9兼容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
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你抱怨说你想要的代码是跨编译器兼容的,符合标准的,并且现在足够干净,其他人会喜欢它。我很抱歉,伙计,你需要安排你的优先事项。有时并非所有约束都能同时满足。这就是生活。