C ++中的奇怪语法:return {.name = value,...}

时间:2015-07-23 17:16:23

标签: c++ return

在阅读文章时,我遇到了以下功能:

SolidColor::SolidColor(unsigned width, Pixel color)
  : _width(width),
    _color(color) {}

__attribute__((section(".ramcode")))
Rasterizer::RasterInfo SolidColor::rasterize(unsigned, Pixel *target) {
  *target = _color;
  return {
    .offset = 0,
    .length = 1,
    .stretch_cycles = (_width - 1) * 4,
    .repeat_lines = 1000,
  };
}

作者使用return语句做了什么?我之前没有见过这样的东西,我不知道如何搜索它...它对普通的C也有效吗?

编辑: link to the original article

2 个答案:

答案 0 :(得分:21)

这不是有效的C ++。

它(有点)使用来自C的几个特征,称为"复合文字"和#34;指定的初始化程序",一些C ++编译器支持作为扩展。 """"来自这个事实,即要成为一个合法的C复合文字,它应该具有看起来像演员的语法,所以你有类似的东西:

return (RasterInfo) {
    .offset = 0,
    .length = 1,
    .stretch_cycles = (_width - 1) * 4,
    .repeat_lines = 1000,
  };

然而,无论语法有何不同,它基本上都会创建一个临时结构,其成员按块中的指定进行初始化,因此大致相当于:

// A possible definition of RasterInfo 
// (but the real one might have more members or different order).
struct RasterInfo {
    int offset;
    int length;
    int stretch_cycles;
    int repeat_lines;
};

RasterInfo rasterize(unsigned, Pixel *target) { 
    *target = color;
    RasterInfo r { 0, 1, (_width-1)*4, 1000};
    return r;
}

最大的区别(如您所见)是指定的初始值设定项允许您使用成员名称来指定初始化程序转到哪个成员,而不是仅仅依赖于订单/位置。

答案 1 :(得分:9)

这是C99 compound literal。此功能特定于C99,但gcc和clang也选择在C ++中实现它(如extension)。

  

6.26复合文字

     

ISO C99支持复合文字。复合文字看起来像一个   包含初始化器的转换器。它的值是该类型的对象   在强制转换中指定,包含在中指定的元素   初始化;这是一个左值。作为扩展,GCC支持化合物   在C90模式和C ++中的文字,虽然语义有点   在C ++中有所不同。