内容简介:C99 开始支持了指定初始化器(Designated Initializers),用来方便的初始化结构体或者数组数据。比如下面的结构体:可以这样初始化:
C99 开始支持了指定初始化器(Designated Initializers),用来方便的初始化结构体或者数组数据。
比如下面的结构体:
typedef struct Rect { int x; int y; int width; int height; } Rect;
可以这样初始化:
Rect r = { .width = 100, .height = 100, };
其中 x, y 未指定的话,会自动初始化为 0。花括号里的字段顺序也没有要求。如果要初始化一个全是 0 的结构体,可以这样:
Rect r = {0}; // Or Rect r1 = {};
需要特别注意的是,第一种写法 {0}
,里的 0,并不是说每个字段都赋值成 0,而是说第一个字段赋值为 0,其余字段用默认值(刚好也是 0)。
假如我们写成:
Rect r = {1}; // r will be { 1, 0, 0, 0}, not {1, 1, 1, 1}
再来看看几个数组初始化的列子:
int a[8] = {[5] = 25, [2] = 15 }; // Or int a[8] = {[5]25 , [2]15 }; // Equals int a[8] = { 0, 0, 15, 0, 0, 25, 0, 0 };
甚至可以用 [first...last]=value
来指定一个区间的值:
int a[] = {[2 ... 3] = 2, [5] = 25}; // Equals int a[] = { 0, 0, 2, 2, 0, 25 }
注意 [first...last]
是从 first 到 last 的闭区间。
指定初始化甚至还可以嵌套,假如结构体定义是这样的:
typedef struct Point { int x; int y; } Point; typedef struct PointCloud { Point p[10]; int width; int height; } PointCloud;
可以这样初始化 PointCloud:
Rect r = { .p[0] = { .x= 10, .y= 10 }, .width = 100, .height = 100 };
然后,甚至可以写出像这样的代码:
void init_some(PointCloud* p) { // do some init } int main(int argc, char* argv[]) { init_some(&(PointCloud){ .p[0] = { .x = 10, .y = 10 }, .width = 100, .height = 100 }); // ... }
上面代码如果使用 C++ 编译,会报错: error: taking the address of a temporary object of type 'PointCloud' [-Waddress-of-temporary]
,可以加编译参数 -Wno-address-of-temporary 解决。不过不是很推荐这么做,关掉这个可能会带来其他隐藏的 BUG。
上面的代码看上去已经不像 C 了,像是另外一门语言。但是简化了初始化的过程。
好了,看上去非常酷,但前面的代码都是纯 C 的,那 C++ 支不支持指定初始化器呢?遗憾的是,直到 C++20 才开始支持指定初始化器(都什么年代了,别人家的 C,99 年就支持了)。
如果在 linux 上用 gcc C++11 去编译上面的代码,会报下面的错:
sorry, unimplemented: non-trivial designated initializers not supported
也别太难过,好消息是作为现代编译器的 clang
,早早的就通过扩展的方式实现了指定初始化器。所以,即使是 C++11,使用 clang 编译和跑上面的代码,也是没有问题的。(Windows 的 MSVC 大概是指望不上了)
回到移动平台,Android NDK 开发时,能不能使用这一特性呢?Android NDK r11 开始就建议大家从 GCC 切到 clang,而且从 NDK r13 开始,默认使用 clang 编译。所以,只要 NDK r13 及以上,都可以愉快的使用这一特性。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- iOS 指定初始化方法
- c# – “SMTP主机未指定” – 但是是否指定?
- 运维安全 | 如何限制指定账户不能SSH只能SFTP在指定目录
- C++ 的一大误区——深入解释直接初始化与复制初始化的区别
- 初始化监听端口
- 类初始化导致死锁
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java编程思想 (第4版)
[美] Bruce Eckel / 陈昊鹏 / 机械工业出版社 / 2007-6 / 108.00元
本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性(深入的面向对象概念、多线程、自动项目构建、单元测试和调试等),本书都能逐步指导你轻松掌握。 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作。本书的作者拥有多年教学经验,对C、C++以及Java语言都有独到......一起来看看 《Java编程思想 (第4版)》 这本书的介绍吧!