簡體   English   中英

可以在C ++中以可移植的方式使用命名屬性初始化POD結構嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM