复合文字(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 ... 
随机推荐
- NOIpDairy
			Day 0 水水比赛 Day 1 写写Dp Part1:Dp基础练习 [HNOI2002]公交车路线 秒切,点数这么少,N这么大,目测O(N)+暴力更新 5min写完 P3842 [TJOI2007] ... 
- 了解Kafka生产者
			了解Kafka生产者  之前对kafka的整体架构有浅显的了解,这次正好有时间,准备深入了解一下kafka,首先先从数据的生产者开始吧. 生产者的整体架构  可以看到整个生产者进程主要由两个线程进 ... 
- Vue插件配置和 后台交互
			Vue插件配置和 后台交互 一.全局配置静态文件(csss, js..) 1.1 全局配置css文件 创建css文件 在main.js配置css文件 // 配置全局css样式 // 方式一 impor ... 
- Centos7.6环境中安装zabbix3.4
			官网链接:https://www.zabbix.com/documentation/3.4/zh/manual/installation/install_from_packages 部署环境 虚拟机服 ... 
- 吴裕雄--天生自然 PYTHON3开发学习:正则表达式
			import re print(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配 print(re.match('com', 'www.runoo ... 
- mysql 数据库保存\n 微信分享时不能换行
			主要因为保存的是\n 但是查询出来是\\n 所以需要把\\n替换为\n即可(不转换的话不会换行并且显示\n) 
- trie(字典树)原理及C++代码实现
			字典树,又称前缀树,是用于存储大量字符串或类似数据的数据结构. 它的原理是利用相同前缀来减少查询字符串的时间. 不同于BST把关键字保存在本结点中,TRIE可以想象成把关键字和下一个结点的指针绑定,事 ... 
- Part-接口测试2
			1.JsonPath:像xpath一样,提取json数值 2.json schema:github -> jsonschema from jsonshema import validate sc ... 
- java静态方法和静态字段
			public class Dog{ public static void main(String[]args){ A a= new A(); a.add(); //java实例对象可以访问类的静态方法 ... 
- day46-守护线程
			#1.守护线程要注意的坑:下面代码只能打印出子线程开始,无法打印出子线程执行完毕,因为主线程在t.start()以后就结束了, #而子线程要睡眠1秒,所以子线程守护线程随着主线程的结束而结束了. fr ... 
