复合文字(Compound Literals)

阅读代码时发现了这行

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

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

1
&(int){1}

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

官网上举的例子是:

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

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

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

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

这相当于:

1
2
3
4
{
struct temp = {x + y, 'a', 0};
structure = temp;
}

验证下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

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)">
1
2
3
4
5
6
[test-dir] uname -r
3.10.0-693.17.1.el7.x86_64
[test-dir] gcc -version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16)
[test-dir] cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

编译通过:

1
gcc test.c -o test

运行:

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

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

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

变量:

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

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

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

相当于:

1
2
3
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++代码中使用复合文字是最安全的。

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

  1. 字面量(literal)与 C 语言复合字面量(compound literals)

    在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)(字面量是相对变量常量等定义的,无论是常量还是变量,其值在某一时刻总是确定的,只是变量可以反复赋值.刷新 ...

  2. C99新增内容之复合文字(compound literal)

    前言: 最近在复习C,发现了一些新东西,例如:变长数组,复合文字,指针的兼容性等.今天先简单谈一下复合文字. 正文: 假如需要向带有一个int参量的函数传递一个值,您可以传递一个int变量,也可以传递 ...

  3. C语言的复合文字

    假设需要向一个带有int型参量的函数传递一个值,这时可以传递一个int型常量,也可以传递一个int型的变量.在C99标准之前,数组参数情况于现在不一样,没有所谓的数组常量可供传递,而在C99中增加了复 ...

  4. c语言:复合文字

    复合文字的意义,相当于是在C语言中,为数组类型定义了一种类似于8之于int,'w'之于char一样的常量类型,所以从C99之后,可以在一些地方使用复合文字来代替数组使用. 复合文字的声明 (]){,, ...

  5. C复合文字

    C99之前,可以传递数组,但是没有所谓的数组常量可供传递,于是新增了复合文字. 普通数组声明方法: int d[2]={10,20}; 复合文字声明: 与数组名相同,常量同时代表元素的地址. (int ...

  6. 复合页( Compound Page )

    复合页(Compound Page)就是将物理上连续的两个或多个页看成一个      独立的大页,它能够用来创建hugetlbfs中使用的大页(hugepage).      也能够用来创建透明大页( ...

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

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  8. C语言复合字面量的使用

    C99添加的特性,复合字面量(composite literal).一旦熟悉并使用,便会体会到简洁强大的表达. 所谓字面量就是固定数值的表示.数值和字符串类型都有字面量的表达.如: // 100, 1 ...

  9. sqlserver索引与查询优化

    此文为转载,仅做保存使用,出处:http://www.cr173.com/html/8688_all.html 在数据库存优化设计中往往会提到索引,这编文章就来详细的说明一下在 SQL SERVER ...

随机推荐

  1. Django搭建后篇——启动服务器及创建视图

    开启服务器,Django开启服务器的方式有两种,一种是在Ubuntu在开启,另一种是直接在pycharm开启.就方便而言肯定是第二种,但由于pycharm版本的问题,可能有的人无法直接在pycharm ...

  2. [NOI2014]魔法森林(LCT)

    蒟蒻又发现自己还没写过LCT…… 首先显然按照权值a从小到大排序,维护b的最小生成树.然后直接扫,代价是加入b的最大值,然后动态加边,因为有边权,所以在lct中边应该理解为点.每次连接(u,v)时,若 ...

  3. dubbo的启动时检查

    修改的消费者(xml) 修改的消费者(注解)

  4. LeetCode——199. 二叉树的右视图

    给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1 < ...

  5. 天融信(NAT)地址转换端口映射配置

    目的地址为公司的公网地址 服务:选择或者自己定义一个端口号,就是要映射到服务器上的那个端口号 目的地址转换为:服务器ip 目的端口转换为:选择定义的服务(端口号) 规则描述:随便写

  6. linux c 调用 python

    /* *gcc -o callpy callpy.cpp -I/usr/include/python3.5 -lpython3.5m */ #include <Python.h> #inc ...

  7. 单调栈and单调队列(此文太多坑了,以后再填)

    单调栈 单调栈是一种特殊的栈,特殊之处在于栈内的元素都保持一个单调性,可能为单调递增,也可能为单调递减. 性质: 单调栈里的元素具有单调性 元素加入栈前,会在栈顶端把破坏栈单调性的元素都删除 使用单调 ...

  8. python学习笔记(19)-切片

    转自https://www.jianshu.com/p/15715d6f4dad 在利用python解决各种实际问题的过程中,经常会遇到从某个对象中抽取部分值的情况,切片操作正是专门用于完成这一操作的 ...

  9. FaceIDViewer.rar

    FaceIDViewer用于查看Office工具栏控件的内置图标编号. 压缩包中包含4个文件,打开任何一个都可以进行查询.其中带有V2字样的文件,已经排除掉了空白图标. Excel版动态图: Word ...

  10. struts.xml中namespace的配置之浏览器兼容性

    还是做练习项目的时候发现一个问题: <span style="font-size:14px;"><package name="default" ...