5

我有两个这样定义的结构(在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. 我可以做我想做的事吗(但显然是以不同的方式)?

  2. 如果是1,我该怎么做?

4

1 回答 1

5

您可以使用复合文字

引用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
于 2017-02-20T17:02:42.730 回答