我在这里看到了这个,我不知道这意味着什么:
&(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声明如下:
Run Code Online (Sandbox Code Playgroud)struct foo {int a; char b[2];} structure;
以下是使用复合文字构造struct foo的示例:
Run Code Online (Sandbox Code Playgroud)structure = ((struct foo) {x + y, 'a', 0});
这相当于编写以下内容:
Run Code Online (Sandbox Code Playgroud){ struct foo temp = {x + y, 'a', 0}; struct
在这种情况下,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++中都是有效的用法.
这并不是很明显,但是如果你看一下周围的代码,它就会变得清晰,它的用途是什么,以及它的含义.
它采用包含单个匿名整数的临时匿名结构的地址,该整数通过C99指定的初始化程序初始化.原因是setsockopt
不需要整数,而是指向它的指针(或者更确切地说,指向某个东西的指针,以及某些东西的大小).
换句话说,向需要指针的函数提供一种整数参数(没有显式的临时变量)是一个非常酷的 hack.
因此,它在功能上与:
int blah = 1;
setsockopt(..., &blah, ...);
Run Code Online (Sandbox Code Playgroud)
......除了它没有介绍之外blah
.
归档时间: |
|
查看次数: |
2892 次 |
最近记录: |