1

几天前我在答案中发现了复合文字如何使用 setsockopt(SO_REUSEADDR)?

所以我尝试编译简单的代码:

#include <stdio.h>
int main()
{
    int * ptr = &(int) {3};
    printf("%d\n", *ptr);
    return 0;
}

使用 gcc 4.9.1,它按预期构建和工作,它打印“3”并且 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++ 选项)来支持复合文字?

4

1 回答 1

1

在 C 语言中,复合文字是左值。在 C 中获取复合文字的地址是完全合法的。在 C 中,本地复合文字一直存在到其封闭块的末尾。

同时,GCC 为 C++(作为非标准扩展)带来了复合文字,并进行了许多重大更改。它们是作为临时对象带来的。在 C++ 中获取临时对象的地址是非法的。C++ 中复合文字的生命周期也与临时变量的生命周期一致——它们一直存在到表达式的末尾。

AFAIK,没有办法让 GCC 的 C++ 复合文字表现得像它们的 C 对应物。

于 2014-08-13T22:01:12.373 回答