Какие анонимные структуры и союзы полезны для C11?

C11 добавляет, помимо прочего, «Анонимные структуры и союзы».

Я ткнул, но не мог найти ясного объяснения, когда полезны анонимные структуры и союзы. Я спрашиваю, потому что я не совсем понимаю, что это такое. Я получаю, что они являются структурами или объединениями без имени впоследствии, но я всегда (должен был?) Рассматривать это как ошибку, поэтому я могу только представить себе использование для названных структур.

Анонимный союз внутри структур очень полезен на практике. Подумайте, что вы хотите реализовать дискриминированный тип суммы (или помеченный союз ), агрегат с логическим значением и либо float, либо char* (то есть строку), в зависимости от флага boolean. С C11 вы должны иметь возможность кодировать

 typedef struct { bool is_float; union { float f; char* s; }; } mychoice_t; double as_float(mychoice_t* ch) { if (ch->is_float) return ch->f; else return atof(ch->s); } 

С C99 вам нужно будет назвать объединение, а код ch->uf и ch->us который будет менее читабельным и более подробным.

Типичное и реальное использование анонимных структур и союзов – это альтернативный взгляд на данные. Например, при реализации типа 3D-точки:

 typedef struct { union{ struct{ double x; double y; double z; }; double raw[3]; }; }vec3d_t; vec3d_t v; vx = 4.0; v.raw[1] = 3.0; // Equivalent to vy = 3.0 vz = 2.0; 

Это полезно, если вы взаимодействуете с кодом, который ожидает 3D-вектор как указатель на три удвоения. Вместо того, чтобы делать f(&v.x) что является уродливым, вы можете сделать f(v.raw) что делает ваше намерение понятным.

 struct bla { struct { int a; int b; }; int c; }; 

тип struct bla имеет член типа анонимной структуры C11.

struct { int a; int b; } struct { int a; int b; } не имеет тега, и объект не имеет имени: это анонимный тип структуры.

Таким образом вы можете получить доступ к членам анонимной структуры:

 struct bla myobject; myobject.a = 1; // a is a member of the anonymous structure inside struct bla myobject.b = 2; // same for b myobject.c = 3; // c is a member of the structure struct bla 

Ну, если вы объявляете переменные из этой структуры только один раз в своем коде, зачем ему нужно имя?

 struct { int a; struct { int b; int c; } d; } e,f; 

И теперь вы можете писать такие вещи, как ea , fdb и т. Д.

(Я добавил внутреннюю структуру, потому что я думаю, что это одно из самых привычных анонимных структур)

 struct Lock; int lock(Lock*); ... struct Queue { Lock; char buf[QBUFSIZE]; char *rp; char *wp; } qputc(Queue* q, char c){ lock(q); ... } 

update3 : ken c делает это некоторое время – например, для компиляции этого и этого .

  • Структура массивов по сравнению с массивом структур в CUDA
  • Копирование одной структуры в другую
  • ARC запрещает объекты Objective-C в структурах или объединениях, несмотря на маркировку файла -fno-objc-arc
  • Что такое «форвардная декларация» и разница между «typedef struct X» и «struct X»?
  • структурированная сериализация в C и передача через MPI
  • Что нужно переопределить в структуре, чтобы обеспечить правильное функционирование равенства?
  • Почему GCC не оптимизирует структуры?
  • Как скомпилировать C-код с анонимными структурами / объединениями?
  • Как определить структуру typedef, содержащую указатели на себя?
  • Скопировать структуру в структуру в C
  • C typedef указателя на структуру
  • Давайте будем гением компьютера.