使用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
}
这甚至是有效的C?
如果是这样的话:复合文字的生命周期是多少?
答案 0 :(得分:8)
C99或以上的有效C.
C99§6.5.2.5复合文字
复合文字的值是由初始化的未命名对象的值 初始化列表。如果复合文字出现在函数体外,则为对象 有静态存储时间;否则,它有自动存储持续时间 封闭的块。
在您的示例中,复合文字具有自动存储,这意味着它的生命周期在其块内,即它所在的main()
函数。
来自@Shafik Yaghmour的推荐阅读:
答案 1 :(得分:2)
每当你看到一个复合文字,如:
struct S *s;
s = &(struct S){1};
您可以将其替换为:
struct S *s;
struct S __HIDDEN_NAME__ = {1};
s = &__HIDDEN_NAME__;
所以:
struct S {int i;};
/* static: lives for the entire program. */
struct S *s = &(struct S){1};
int main() {
/* Lives inside main, and any function called from main. */
s = &(struct S){1};
/* Only lives in this block. */
{
s = &(struct S){1};
}
/* Undefined Behavior: lifetime has ended. */
s->i;
}