前几天我在答案Compound literals
中发现了How do I use setsockopt(SO_REUSEADDR)?所以我尝试编译简单的代码:
#include <stdio.h>
int main()
{
int * ptr = &(int) {3};
printf("%d\n", *ptr);
return 0;
}
使用gcc 4.9.1,它按预期构建和工作,它打印&#34; 3&#34;并且valgrind不会报告内存损坏。
但是使用g ++ 4.9.1时,它不会构建:
$ g++ main.c
main.c: In function ‘int main()’:
main.c:4:23: error: taking address of temporary [-fpermissive]
int * ptr = &(int) {3};
^
是否有一种方法(比如g ++选项)支持Compound literal?
答案 0 :(得分:1)
在C语言中,复合文字是左值。在C中获取复合文字的地址是完全合法的。在C中,本地复合文字存在于其封闭块的末尾。
与此同时,GCC将复合文字带入C ++(作为非标准扩展),并带来了许多重大变化。它们被作为临时对象引入。在C ++中获取临时对象的地址是违法的。 C ++中复合文字的生命周期也与临时文本的生命周期一致 - 它们一直存在于表达式的末尾。
AFAIK,没有办法让GCC的C ++复合文字表现为C语言。