位域结构可以实例化为立即数吗?
Can a bit field structure be instantiated as an immediate?
假设我有以下(编造的)定义:
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 实例化为立即数以作为参数传递而不先将其分配给变量?
[我发现是的,这是可能的,所以我正在回答我自己的问题。但我不能保证这是可移植的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;
}
假设我有以下(编造的)定义:
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 实例化为立即数以作为参数传递而不先将其分配给变量?
[我发现是的,这是可能的,所以我正在回答我自己的问题。但我不能保证这是可移植的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;
}