作为参数传递的复合文字的生命周期是多少?

ves*_*tol 7 c struct compound-literals

使用clang编译时没有警告.

typedef struct {
  int option;
  int value;
} someType;

someType *init(someType *ptr) {
  *ptr = (someType) {
    .option = ptr->option | ANOTHEROPT,
    .value = 1
  };

  return ptr;
}

int main()
{
  someType *typePtr = init( &(someType) {
    .option = SOMEOPT
  });
  // do something else with typePtr
}
Run Code Online (Sandbox Code Playgroud)
  1. 这甚至是有效的C吗?

  2. 如果是这样的话:复合文字的生命周期是多少?

Yu *_*Hao 8

它是C99或以上的有效C.

C99§6.5.2.5 复合文字

复合文字的值是初始化列表初始化的未命名对象的值.如果复合文字出现在函数体外,则该对象具有静态存储持续时间; 否则,它具有与封闭块相关的自动存储持续时间.

在您的示例中,复合文字具有自动存储,这意味着它的生命周期在其块内,即main()它所在的函数.

来自@Shafik Yaghmour的推荐阅读:

  1. 新C:复合文字
  2. GCC手册:6.25复合文字