标签:c
C99增加的特性,复合字面量(composite literal)。一旦熟悉并使用,便会体会到简洁强大的表达。
所谓字面量就是固定数值的表示。数值和字符串类型都有字面量的表达。如:
// 100, 1.23f, "literral" 都是字面量 int x = 100; float y = 1.23f; char* s = "literral";
那么复合字面量是几个意思的复合?
composite 除了有复合的意思,也有组合的概念。既然组合,必然数组是直观的对应。
所以,复合字面量就是数组字面量的意思。
曾经,我们是如何定义数组的。
int arr1[] = {0, 1, 2, 3}; int arr2[10] = {0};
int x; // 正确 x = 100; int arr[1]; // 错误 arr = {0};
对, 复合字面量,就是可以随时定义,随时赋值的数组字面量。两步构建出来。
1. 形如 (type[]) 表示需要构建的数组类型,如: (int[]), (int*p), 还能是自定义的类型 (MyType[])
2. 跟着 { } 表示数组内容
int* intArr1 = (int[]) {0, 1, 2}; int* intArr2 = (int[100]) {0}; intArr1 = (int[]) {3, 4, 5}; intArr2 = (int[1]) {1}; typedef struct { void* data; int length; } Array; Array* arr1 = (Array[]) {NULL, 0}; Array* arr2 = (Array[1]) {(int[]) {1}, 1};
能够随时定义出一个,数组的字面量指针,能够让参数传递,初始化结构,更加的简洁。
举个例子:
typedef struct { void* data; int length; } Array; void foo(Array* arr) { } // 曾经的写法 int data[] = { 1 }; Array arr [1] = {data, 1}; foo(arr); // 现在的写法 foo((Array[]) { (int[]) { 1 }, 1 });
static Array* arr = (Array[]) { (int[10]) {0}, 1 };这个例子说明了,初始化一个结构时候的用法。任何一个复杂的自定义类型,我们都能够通过复合文字定义出初始化的字面数值。
这在构建一些需要初始化的固定数据结构很有用处。
还有, 复合文字可以做左值。无论字面数值创建在栈上还是在堆上,都可以被赋值。
这就厉害了,可以发挥想象,有更多的黑魔法有待发掘。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:c
原文地址:http://blog.csdn.net/tom_221x/article/details/46684209