&(int){1}在C++中的含义是什么?

Enu*_* Ti 29 c++ c99

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

&(int) { 1 }
Run Code Online (Sandbox Code Playgroud)

我觉得这很奇怪,因为它似乎是无效的语法.它正在构建一个块范围(?),中间有一个随机1(没有分号)并取地址.对我来说没有多大意义.你们能开导我吗?

尝试用C++ 11,所以它编译:

auto a = &(int) { 1 };
Run Code Online (Sandbox Code Playgroud)

但我不知道如何处理变量.

Sha*_*our 32

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

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

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

 struct foo {int a; char b[2];} structure;
Run Code Online (Sandbox Code Playgroud)

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

 structure = ((struct foo) {x + y, 'a', 0});
Run Code Online (Sandbox Code Playgroud)

这相当于编写以下内容:

 {
   struct foo temp = {x + y, 'a', 0};
   struct
Run Code Online (Sandbox Code Playgroud)

在这种情况下,a指向int的指针类型.希望这是最初的C代码,因为gcc文档说:

在C中,复合文字指定具有静态或自动存储持续时间的未命名对象.在C++中,复合文字指定一个临时对象,该对象只存在于其完整表达式的末尾.

因此,在C++中获取地址可能是一个坏主意,因为对象的生命周期在完整表达式结束时结束.虽然,它可能是C++代码,它只依赖于未定义的行为.

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

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

如果我们使用的-fpermissive是gcc,它确实允许这个代码编译.虽然旧版本似乎允许使用它,但我无法用现代版本中的任何标志来构建此代码-Wno-address-of-temporary.我想知道gcc是否允许它作为旧扩展遗留物.

注意,C中的Cryptic结构定义有一个非常有趣的(取决于你有趣的定义)复合文字的使用.

假设Schism 是正确的,这个问题是原始来源,那么在该示例中使用该代码:

if (setsockopt(server_connection.socket, SOL_SOCKET, SO_REUSEADDR, &(int) { 1 }, sizeof(int)) < 0) {
Run Code Online (Sandbox Code Playgroud)

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


Dam*_*mon 5

这并不是很明显,但是如果你看一下周围的代码,它就会变得清晰,它的用途是什么,以及它的含义.

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

换句话说,向需要指针的函数提供一种整数参数(没有显式的临时变量)是一个非常酷的 hack.

因此,它在功能上与:

int blah = 1;
setsockopt(..., &blah, ...);
Run Code Online (Sandbox Code Playgroud)

......除了它没有介绍之外blah.