复合文字(Compound Literals)
复合文字(Compound Literals)
阅读代码时发现了这行
1 |
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&(int){1},sizeof(int));
|
发现之前没有见过这种写法
1 |
&(int){1}
|
上网搜索发现Compound Literals是c99添加的新特性,gcc在c90和c++中也支持此种特性,但在c++中的语义有所不同.
官网上举的例子是:
假如一个结构体的定义如下:
1 |
struct {
|
那么使用复合文字构造一个结构体的方法如下:
1 |
structure = ((struct foo){x + y,'a',0});
|
这相当于:
1 |
{
|
验证下:
1 |
struct {
|
在我的系统上:
1 |
[test-dir] uname -r |
编译通过:
1 |
gcc test.c -o test |
运行:
1 |
[test-dir] ./test |
还可以用来初始化二维数组:
1 |
char **foo = (char *[]) { "x", "y", "z" };
|
变量:
1 |
int i = ++(int) { 1 };
|
作为GNU的拓展,gcc允许通过这用特性初始化静态变量
1 |
static struct x = (struct ) {1, 'a', 'b'};
|
相当于:
1 |
static struct foo x = {1, 'a', 'b'};
|
在C中,复合文字指定具有静态或自动存储时间的未命名对象,而在C++中代表一个临时的对象,生命周期只能到其表达式的末尾。结果就是在C中复合文字中的子对象会被分配地址,在C++中则是未定义的行为,因此g++不会为临时的数组转化为指针。
例如,如果数组复合文字foo的实例出现在函数内部,在C++中后续任何使用foo的结果都是未定义的,因为数组foo的生命周期在其声明之后就结束了。
作为优化,在g++中有时会给复合文字数组更长的生命周期,例如在函数之外或者用const修饰,如果foo及其初始化程序具有char * const类型而不是char *类型的元素,亦或者foo是全局变量,这个数组则有静态存储的生命周期,但是,避免在C++代码中使用复合文字是最安全的。
复合文字(Compound Literals)的更多相关文章
- 字面量(literal)与 C 语言复合字面量(compound literals)
在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)(字面量是相对变量常量等定义的,无论是常量还是变量,其值在某一时刻总是确定的,只是变量可以反复赋值.刷新 ...
- C99新增内容之复合文字(compound literal)
前言: 最近在复习C,发现了一些新东西,例如:变长数组,复合文字,指针的兼容性等.今天先简单谈一下复合文字. 正文: 假如需要向带有一个int参量的函数传递一个值,您可以传递一个int变量,也可以传递 ...
- C语言的复合文字
假设需要向一个带有int型参量的函数传递一个值,这时可以传递一个int型常量,也可以传递一个int型的变量.在C99标准之前,数组参数情况于现在不一样,没有所谓的数组常量可供传递,而在C99中增加了复 ...
- c语言:复合文字
复合文字的意义,相当于是在C语言中,为数组类型定义了一种类似于8之于int,'w'之于char一样的常量类型,所以从C99之后,可以在一些地方使用复合文字来代替数组使用. 复合文字的声明 (]){,, ...
- C复合文字
C99之前,可以传递数组,但是没有所谓的数组常量可供传递,于是新增了复合文字. 普通数组声明方法: int d[2]={10,20}; 复合文字声明: 与数组名相同,常量同时代表元素的地址. (int ...
- 复合页( Compound Page )
复合页(Compound Page)就是将物理上连续的两个或多个页看成一个 独立的大页,它能够用来创建hugetlbfs中使用的大页(hugepage). 也能够用来创建透明大页( ...
- Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- C语言复合字面量的使用
C99添加的特性,复合字面量(composite literal).一旦熟悉并使用,便会体会到简洁强大的表达. 所谓字面量就是固定数值的表示.数值和字符串类型都有字面量的表达.如: // 100, 1 ...
- sqlserver索引与查询优化
此文为转载,仅做保存使用,出处:http://www.cr173.com/html/8688_all.html 在数据库存优化设计中往往会提到索引,这编文章就来详细的说明一下在 SQL SERVER ...
随机推荐
- python all()函数
1.描述all() 函数——用于判断给定的可迭代参数 iterable 中的所有元素是否都为TRUE,如果是返回 True,否则返回 False.元素除了是 0.空.FALSE 外都算 TRUE.2. ...
- python-day8爬虫基础之数据存储
数据存储,在爬虫中也是十分的重要,因为我们要把我们想要的数据保存到本地,其中最简单直接的就是保存为文件文本,比如:TXT.JSON.CSV等等,除此之外,我们还可以将其保存到数据库中,常见的数据库类型 ...
- Windows、Linux(Ubuntu)修改 pip 镜像源
一.Windows 修改 pip 镜像源 1.win + R 打开运行,输入 %APPDATA% 2.按下回车,打开文件夹. 3.在该文件夹下,新建文件夹,命名 pip. 4.进入 pip 文件夹, ...
- LeetCode No.145,146,147
No.145 PostorderTraversal 二叉树的后序遍历 题目 给定一个二叉树,返回它的 后序 遍历. 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 示例 输入: [1,null,2 ...
- debian下通过scp 上传下载文件
1.上传本地文件到服务器 scp /path/filename username@servername:/path/ 2.从服务器上下载文件 scp username@servername:/path ...
- day50-线程-定时器
#1.定时器: from threading import Timer def func(): print('定时器') t = Timer(1,func) #定时一秒,开启func线程. t.sta ...
- 基于Dijsktra算法的最短路径求解
基于Dijsktra算法的最短路径求解 描述 一张地图包括n个城市,假设城市间有m条路径(有向图),每条路径的长度已知.给定地图的一个起点城市和终点城市,利用Dijsktra算法求出起点到终点之间 ...
- Codeforces Round #573 (Div. 1) 差F
Codeforces Round #573 (Div. 1) E 题意:二维平面上有 n 个点,你可以放至多 m 条直线使得 (0,0) 与每个点的连线至少与一条直线相交.求原点与所有直线的距离最小值 ...
- KMP匹配(模板)
先粘上我入门KMP时看的大佬的博客:orz orz 从头到尾彻底理解KMP 我觉得这篇已经讲的很详细了,希望大家能坚持看下去. 步骤 ①寻找前缀后缀最长公共元素长度对于P = p0 p1 ...pj- ...
- 二十五、SSH服务企业级应用场景
一.需求分析: 要求所有服务器在同一个用户oldboy1系统用户下,实现A机器从本地分发数据到B\C机器上,在分发过程中不需要B\C的提示系统密码验证,除了分发功能,还需要可以批量查看客户上的cpu. ...