[英]Can POD-structs be initialized using named attributes in a portable way in C++?
我試圖以與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)。 結構是第三方,我不能以任何方式改變它們。
不,你不能命名這些值,只需按順序給它們。
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.