复合文字(Compound Literals)

复合文字(Compound Literals)

阅读代码时发现了这行

1
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&(int){1},sizeof(int));

发现之前没有见过这种写法

1
&(int){1}

上网搜索发现Compound Literalsc99添加的新特性,gccc90c++中也支持此种特性,但在c++中的语义有所不同.

官网上举的例子是:

假如一个结构体的定义如下:

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

那么使用复合文字构造一个结构体的方法如下:

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

这相当于:

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

验证下:

12345678910111213141516

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

int main(){        int x = 1;    int y = 2;    structure = ((struct foo){x + y,'a',0});                                                                                   printf("stu.a:%dn",structure.a);    printf("stu.b:%sn",structure.b);    return 0;}

在我的系统上:

大专栏  复合文字(Compound Literals)">

123456
[test-dir] uname -r3.10.0-693.17.1.el7.x86_64[test-dir] gcc -versiongcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)[test-dir] cat /etc/redhat-releaseCentOS Linux release 7.4.1708 (Core)

编译通过:

1
gcc test.c -o test

运行:

123
[test-dir] ./test                                                     stu.a:3stu.b:a

还可以用来初始化二维数组:

1
char **foo = (char *[]) { "x", "y", "z" };

变量:

1
int i = ++(int) { 1 };

作为GNU的拓展,gcc允许通过这用特性初始化静态变量

123
static struct  x = (struct ) {1, 'a', 'b'};static int y[] = (int []) {1, 2, 3};static int z[] = (int [3]) {1};

相当于:

123
static struct foo x = {1, 'a', 'b'};static int y[] = {1, 2, 3};static int z[] = {1, 0, 0};

在C中,复合文字指定具有静态或自动存储时间的未命名对象,而在C++中代表一个临时的对象,生命周期只能到其表达式的末尾。结果就是在C中复合文字中的子对象会被分配地址,在C++中则是未定义的行为,因此g++不会为临时的数组转化为指针。

例如,如果数组复合文字foo的实例出现在函数内部,在C++中后续任何使用foo的结果都是未定义的,因为数组foo的生命周期在其声明之后就结束了。

作为优化,在g++中有时会给复合文字数组更长的生命周期,例如在函数之外或者用const修饰,如果foo及其初始化程序具有char * const类型而不是char *类型的元素,亦或者foo是全局变量,这个数组则有静态存储的生命周期,但是,避免在C++代码中使用复合文字是最安全的。

原文地址:https://www.cnblogs.com/lijianming180/p/12041284.html

时间: 2024-10-03 00:35:56

复合文字(Compound Literals)的相关文章

c语言:复合文字

复合文字的意义,相当于是在C语言中,为数组类型定义了一种类似于8之于int,'w'之于char一样的常量类型,所以从C99之后,可以在一些地方使用复合文字来代替数组使用. 复合文字的声明 (int [3]){1,2,3}; //一个复合文字,定义类似于数组的定义(int []){1,2,5,6,8}; //类似于数组,复合文字的定义也可以省略大小 因为复合文字没有名称,所以,不能在一个语句中创建,而在另一个语句中使用.必须在一个语句中创建的同时使用他们. 一种可能的使用方法是在创建的同时使用指针

保护数组内容、复合文字

1.使用const可以对数组函数提供保护,可以阻止函数修改调用函数中的数据.总之,如果函数想修改数组,那么在声明数组参量时就不要使用const.如果函数不需要修改参量,就需要加const. 2.指针和多维数组.(267).变长数组(273) 3.复合文字 例如:(int [2]) {10,20}这是一个复合文字,它表示一个包含两个int值得无名称数组. (int [3]){20,30,40}有3个元素的复合文字. 通过指针保存复合文字的位置:int * pt1; pt1=(int [2]) {1

复合文字

123, 3.14, 'X', "hello"都是复合文字 (int [2]){10, 20}; // 一个复合文字, 创建了一个包含两个int值的无名称数组 (int []){10, 20}; // 自动计算元素数目 int * ptr; ptr = (int [2]){10, 20}; int (* ptr)[4]; ptr = (int [2][4]){{1, 2, 3, -9}, {4, 5, 6, -8}}; // 复合文字类型是int[2][4]

复合页( Compound Page )

复合页(Compound Page)就是将物理上连续的两个或多个页看成一个 独立的大页,它可以用来创建hugetlbfs中使用的大页(hugepage), 也可以用来创建透明大页(transparent huge page)子系统.但是 它不能用在页缓存(page cache)中,这是因为页缓存中管理的都是 单个页. 分配一个复合页的方式是:使用alloc_pages函数,参数order至少为1, 且设置__GFP_COMP标记.因为根据复合页的定义,它通常包括2个或多 个连续的物理内存页,这是

复合模式Compound -- 学习HeadFirst设计模式记录

? 复合模式:结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题. ? 典型应用:MVC模式,M:Model, V:View, C:Controller.类似的还有Web:浏览器/服务器模型. ? ?

C语言复合字面量的使用

C99添加的特性,复合字面量(composite literal).一旦熟悉并使用,便会体会到简洁强大的表达. 所谓字面量就是固定数值的表示.数值和字符串类型都有字面量的表达.如: // 100, 1.23f, "literral" 都是字面量 int x = 100; float y = 1.23f; char* s = "literral"; 可看到字面构建的同一时候就能够复制给变量使用.既然是固定数值,那么在初始化的时候就能够构建. 那么复合字面量是几个意思的

Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/a6qIB7SqOlc/优酷:http://v.youku.com/v_show/id_

C99标准的新特性

C语言标准的发展 C语言的发展历史大致上分为4个阶段:Old Style C.C89.C99和C11. C89是最早的C语言规范,于1989年提出,1990年先由ANSI(美国国家标准委员会,American National Standards Institute)推出ANSI版本,后来被接纳为ISO国际标准(ISO/IEC9899:1990),因而有时也称为C90,最经典的C语言教材[K&R]就是基于这个版本的,C89是目前最广泛采用的C语言标准,大多数编译器都完全支持C89,C99(ISO

sqlserver索引与查询优化

此文为转载,仅做保存使用,出处:http://www.cr173.com/html/8688_all.html 在数据库存优化设计中往往会提到索引,这编文章就来详细的说明一下在 SQL SERVER 下面的建立索引的技巧和需要注意的一些地方,让您可以更直观的了解数据库的结构. 往往在数据量比较小,查询量也不是很大的时候我们往往会忽视索引的存在. 总结优化如下: 1.主键就是聚集索引 2.只要建立索引就能显著提高查询速度 3.把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度 (四)其他书