Bee*_*ope 9 c c99 initializer language-lawyer temporary-objects
我无法想象这已经不是重复了,但我不能轻易找到答案,因为特别针对C++的更复杂的场景似乎主宰了讨论0.
在C99中取一个函数调用的参数列表中的临时构造地址是否合法?
例如,类似于init_list
或init_desig_init
如下的内容:
typedef struct {
int x;
int y;
} point_t;
int manhattan(point_t *p) {
return p->x + p->y;
}
int init_list() {
return manhattan(&(point_t){1, 2});
}
int init_desig_init() {
return manhattan(&(point_t){.x = 1});
}
Run Code Online (Sandbox Code Playgroud)
三大1 似乎编译好了,但我实际上找不到一个参考,解释临时的生命周期至少会通过函数调用来扩展.
0事实证明,根据下面MM的回答,我的部分搜索问题是因为我正在寻找有关临时数据的信息,而这个特定初始化结构的正确C术语是复合文字.
1我应该称之为"大跨平台三",尊重MSVC,但实际上我的意思是"C编译器神棒支持".
(point_t){1, 2}
不是"临时的".这是一个复合文字.(C++中相同的令牌序列具有不同的含义,这两种语言不应相互混淆).
复合文字是左值,因此在其上使用一元运算&
符是合法的.存储时间由C11 6.5.2.5/5涵盖:
如果复合文字出现在函数体外,则该对象具有静态存储持续时间; 否则,它具有与封闭块相关的自动存储持续时间.
所以这段代码是正确的,复合文字保持存在直到声明它的函数结束.