我试图以与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;
};
我无法将 -Wno-gnu-designator 添加到 CXXFLAGS ,因为GCC将拒绝构建,因为它不知道该标志。我不能在没有命名属性的情况下使用初始化列表,因为如果API发生变化,我们将会遇到严重的问题。
我需要的解决方案必须符合C ++标准,同时保留以下事实:如果结构中出现新属性,它们应该是未初始化的(或者最好是NULL)。结构是第三方,我不能以任何方式改变它们。
答案 0 :(得分:4)
不,你不能命名这些值,只需按顺序给它们。
A a = { 42 };
如果在结构的末尾添加新字段,它们将被清零。
答案 1 :(得分:2)
你可以这样做:
#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;