【问题标题】:error: taking address of temporary [-fpermissive] while compiling &(int) {}错误:在编译 &(int) {} 时获取临时 [-fpermissive] 的地址
【发布时间】:2014-08-13 18:56:34
【问题描述】:

我几天前在答案How do I use setsockopt(SO_REUSEADDR)?中发现了Compound literals

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

#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++ 选项)支持复合文字?

【问题讨论】:

  • g++ 很好地支持复合文字,它只是不允许您获取一个的地址,这是明智的。它也不允许您获取其他类型文字的地址,例如int* p = &amp;3;,这也是明智之举。说int i = (int){3}; printf("%d\n", i); 而不是尝试获取其地址有什么问题?

标签: gcc g++ compound-literals


【解决方案1】:

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

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

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

【讨论】:

猜你喜欢
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 2021-11-05
  • 1970-01-01
相关资源
最近更新 更多