Можно ли инициализировать POD-структуры с использованием именованных атрибутов в C ++? - PullRequest
3 голосов
/ 19 апреля 2011

Я пытаюсь инициализировать структуру с использованием именованных атрибутов способом, совместимым как с 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 ++, сохраняя тот факт, что если новые атрибуты появляются вstruct они должны быть неинициализированы (или предпочтительно NULL).Структуры являются сторонними, и я не могу их никоим образом изменять.

Ответы [ 2 ]

4 голосов
/ 19 апреля 2011

Нет, вы не можете называть значения, просто приводите их по порядку.

A a = { 42 };

Если новые поля добавляются в конце структуры, они будут обнулены.

2 голосов
/ 19 апреля 2011

Вы можете сделать что-то вроде этого:

#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;
...