繁体   English   中英

&(int){1}在C ++中是什么意思?

[英]What does &(int) { 1 } mean in C++?

我在这里看到了这个,我不知道这意味着什么:

&(int) { 1 }

我认为这很奇怪,因为它看起来像无效的语法。 它在中间插入一个随机数为1(无分号)的块范围(?),并获取地址。 对我来说没有多大意义。 你们能启发我吗?

用C ++ 11进行了试用,因此可以编译:

auto a = &(int) { 1 };

但是我不知道该如何处理变量。

据我所知这是一个复合文字 ,它是C99功能,它不是标准的C ++,但gcc和clang都支持它作为扩展:

ISO C99支持复合文字。 复合文字看起来像包含初始化程序的强制类型转换。 它的值是强制类型转换中指定类型的对象,其中包含初始化程序中指定的元素; 它是一个左值。 作为扩展,GCC在C90模式和C ++中支持复合文字,尽管C ++中的语义有些不同。

通常,指定的类型是结构。 假设如下所示声明了struct foo和structure:

  struct foo {int a; char b[2];} structure; 

这是使用复合文字构造struct foo的示例:

  structure = ((struct foo) {x + y, 'a', 0}); 

这等效于编写以下内容:

  { struct foo temp = {x + y, 'a', 0}; struct 

在这种情况下的类型a会指向int的指针。 希望这原本是C代码,因为gcc文件说:

在C中,复合文字表示具有静态或自动存储持续时间的未命名对象。 在C ++中,复合文字指定了一个临时对象,该对象仅生存到其完整表达式的结尾。

因此,在C ++中获取地址可能不是一个好主意,因为对象的生命周期在完整表达式的结尾就结束了。 虽然,它可能是仅依赖未定义行为的C ++代码。

这是使用正确标志确实有很大帮助的情况之一,在gcc和clang中,使用-pedantic都会产生警告和错误,例如gcc说:

warning: ISO C++ forbids compound-literals [-Wpedantic]
 auto a = &(int) { 1 };
                     ^
error: taking address of temporary [-fpermissive]

如果我们使用-fpermissive是gcc,则确实允许该代码进行编译。 尽管旧版本似乎允许使用-Wno-address-of-temporary但在现代版本中,我无法让clang生成带有任何标志的代码。 我不知道gcc是否允许它作为旧扩展残余

注意, C语言中的隐式结构定义问题对复合文字的使用非常有趣( 取决于您对有趣的定义 )。

假设Schism 是正确的,并且这个问题是原始问题 ,那么在示例中该代码中的用法如下:

if (setsockopt(server_connection.socket, SOL_SOCKET, SO_REUSEADDR, &(int) { 1 }, sizeof(int)) < 0) {

在C99和C ++中都是有效的用法。

这不是立即显而易见的,但是如果您查看周围的代码,就会清楚地知道它的用途以及它的用途。

它采用一个临时匿名结构的地址,该结构包含一个通过C99指定的初始化程序初始化的单个匿名整数。 原因是setsockopt不需要整数,而是想要一个整数(或者更确切地说,是指向某物的指针,以及某物的大小)。

换句话说,为需要指针的函数提供一种整数参数(没有显式的temp变量)是一个很酷的技巧。

因此,它在功能上等同于:

int blah = 1;
setsockopt(..., &blah, ...);

...除了它的工作没有引入blah

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM