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

Fot*_*los 22 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,
  };
}
Run Code Online (Sandbox Code Playgroud)

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

编辑: 链接到原始文章

Jer*_*fin 21

这不是有效的C++.

它是(某种程度上)使用C中的一些特性,称为"复合文字"和"指定初始化器",一些C++编译器支持它作为扩展."有点"来自于这样一个事实:要成为一个合法的C复合文字,它应该具有看起来像一个演员的语法,所以你有类似的东西:

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

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

// 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;
}
Run Code Online (Sandbox Code Playgroud)

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


Naz*_*554 9

这是一个C99 复合文字.此功能特定于C99,但gcc和clang也选择在C++中实现它(作为扩展名).

6.26复合文字

ISO C99支持复合文字.复合文字看起来像包含初始值设定项的强制转换.它的值是转换中指定类型的对象,包含初始值设定项中指定的元素; 这是一个左值.作为扩展,GCC支持C90模式和C++中的复合文字,尽管语义在C++中有些不同.

  • 嗯,什么?“...看起来像是包含初始化程序的强制转换。” 这如何符合这个问题?-1。 (2认同)