Можно ли создать структуру битового поля как непосредственную? - PullRequest
0 голосов
/ 06 апреля 2019

Предположим, у меня есть следующее (составленное) определение:

typedef union {
  struct {
    unsigned int red: 3;
    unsigned int grn: 3;
    unsigned int blu: 2;
  } bits;
  uint8_t reg;
} color_t;

Я знаю, что могу использовать это для инициализации переменной, которая передается функции, например:

color_t white = {.red = 0x7, .grn = 0x7, .blu = 0x3};
printf("color is %x\n", white.reg);

... но в стандартном C возможно ли создать экземпляр color_t как непосредственный элемент для передачи в качестве аргумента, не назначая его сначала переменной?

1 Ответ

1 голос
/ 06 апреля 2019

[Я обнаружил, что да, это возможно, поэтому я отвечаю на свой вопрос. Но я не могу пообещать, что это переносной C.]

Да, это возможно. И синтаксис более или менее, что вы ожидаете. Вот полный пример:

#include <stdio.h>
#include <stdint.h>


typedef union {
  struct {
    unsigned int red: 3;
    unsigned int grn: 3;
    unsigned int blu: 2;
  } bits;
  uint8_t reg;
} color_t;

int main() {
  // initializing a variable
  color_t white = {.bits={.red=0x7, .grn=0x7, .blu=0x3}};
  printf("color1 is %x\n", white.reg);

  // passing as an immediate argument
  printf("color2 is %x\n", (color_t){.bits={.red=0x7, .grn=0x7, .blu=0x3}}.reg);

  return 0;
}
...