我有两个结构定义如此(在color.h
中):
typedef struct rgb {
uint8_t r, g, b;
} rgb;
typedef struct hsv {
float h, s, v;
} hsv;
hsv rgb2hsv(rgb color);
rgb hsv2rgb(hsv color);
然后我在main.c
中有以下内容:
hsv hsvCol = {i/255.0, 1, 1};
rgb col = hsv2rgb(hsvCol);
我希望能够在hsvCol
的参数内创建变量hsv2rgb
,而无需创建变量并将其作为参数传递。
我已经尝试了以下各项(代替上面的两行),遗憾的是没有编译:(
rgb col = hsv2rgb({i/255.0, 1, 1});
rgb col = hsv2rgb(hsv {i/255.0, 1, 1});
rgb col = hsv2rgb(hsv hsvCol {i/255.0, 1, 1})
rgb col = hsv2rgb(struct hsv {i/255.0, 1, 1});
我的问题是:
我可以做我想做的事情(但显然是以不同的方式)吗?
如果是1,我该怎么做呢?
答案 0 :(得分:5)
您可以使用compound literal。
引用C11
,章节§6.5.2.5,第3段,
后缀表达式,由带括号的类型名称后跟括号括起来组成 初始化列表是复合文字。它提供了一个未命名的对象,其值由初始化列表给出。
和第5段,
复合文字的值是由初始化的未命名对象的值 初始化列表。 [...]
因此,在您的情况下,代码如
hsv hsvCol = {i/255.0, 1, 1};
rgb col = hsv2rgb(hsvCol);
可以重写为
rgb col = hsv2rgb( ( hsv ) {i/255.0, 1, 1} );
^^^^ ^^^^^^^^^^^^^
| |
| -- brace enclosed list of initializers
-- parenthesized type name
答案 1 :(得分:0)
正如BLUEPIXY在评论中所说,我需要做的就是将(hsv)
放在我的价值面前作为演员。
rgb col = hsv2rgb((hsv) {i/255.0, 1, 1});