例解GNU C之指定初始化项目

来源:互联网 发布:抽数字软件 编辑:程序博客网 时间:2024/05/20 16:11
例解GNU C之指定初始化项目 - tanglinux - 博客频道 - CSDN.NET

http://blog.csdn.net/npy_lp/article/details/7010886

 前言:计算机语言是编译器和程序员交流的依据和规范,GNU C是GCC特有的功能,在Linux内核中被广泛应用。

    帮助文档:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions

 

    指定初始化项目(Designated Initializers):指的是可以对数组中的某些元素或结构体变量中的某些成员以任意的顺序进行选择性的初始化。

    1、在数组中的应用

    在数组的初始化列表中使用“[index]= value”这样的形式即可实现对指定(通过index指定)的某个元素进行初始化。

    举例,如清单1: 

[cpp] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. int main(void)  
  4. {  
  5.     int i;  
  6.     int arr[6] = { [3] = 29, 18, [0] = 12, 33}; //等价于int arr[6] = { [3] = 29, [4] = 18, [0] = 12, [1] = 33};  
  7.                             //也就是等价于int arr[6] = {12, 33, 0, 29, 18, 0};  
  8.   
  9.     for (i = 0; i < 6; i++)  
  10.     printf("arr[%d]: %d\n", i, arr[i]);  
  11.   
  12.     return 0;  
  13. }  

    例子输出结果: 

[cpp] view plaincopy
  1. arr[0]: 12  
  2. arr[1]: 33  
  3. arr[2]: 0  
  4. arr[3]: 29  
  5. arr[4]: 18  
  6. arr[5]: 0  

    如例子中的第6行,通过[3] = 29把arr[3]初始化为29,通过[0] = 12把arr[0]初始化为12。

    说明(1):如果在一个指定初始化项目后跟有不止一个值,如例子中的[3] =29, 18,则这些多余的数值将用来对后续的数组元素进行初始化,即数值18用来初始化arr[4]。

    提醒:对C语言数组来说,在初始化一个或多个元素后,其中未经初始化的元素都将被自动地初始化为0或者NULL(针对指针变量而言)。未经过任何初始化的数组,其所有元素的值都将是不确定的(针对局部变量而言)。

    同一元素被多次初始化的例子,如清单2: 

[cpp] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. int main(void)  
  4. {  
  5.     int i;  
  6.     int arr[5] = {23, 3, 45, [1] = 34, 8};  
  7.   
  8.     for (i = 0; i < 5; i++)  
  9.     printf("arr[%d]: %d\n", i, arr[i]);  
  10.   
  11.     return 0;  
  12. }  

    例子输出结果: 

[cpp] view plaincopy
  1. arr[0]: 23  
  2. arr[1]: 34  
  3. arr[2]: 8  
  4. arr[3]: 0  
  5. arr[4]: 0  

    如例子中的第6行,元素arr[1]和arr[2]先被分别初始化为3和45,后又通过指定初始化项目[1] = 34, 8把arr[1]和arr[2]的值改变为34和8。

    说明(2):如果多次对同一个元素进行初始化,则最后一次初始化的值有效。这也很好理解,因为数组的每个元素都是一个变量,不断对同一变量赋不同值,当然这个变量的最终值为最后赋的值。

    指定初始化项目的特性在ISO C99中已经被支持。

    GNU C还支持“[first … last] = value”的形式,即一个范围内的几个元素被初始化为同一值,举例,如清单3: 

[cpp] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. int main(void)  
  4. {  
  5.     int i;  
  6.     int arr[] = { [0 ... 3] = 1, [4 ... 5] = 2, [6 ... 9] = 3};  
  7.   
  8.     for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)  
  9.     printf("arr[%d]: %d\n", i, arr[i]);  
  10.   
  11.     return 0;  
  12. }  

    例子输出结果: 

[cpp] view plaincopy
  1. arr[0]: 1  
  2. arr[1]: 1  
  3. arr[2]: 1  
  4. arr[3]: 1  
  5. arr[4]: 2  
  6. arr[5]: 2  
  7. arr[6]: 3  
  8. arr[7]: 3  
  9. arr[8]: 3  
  10. arr[9]: 3  

    2、在结构体变量中的应用

    在结构体变量的初始化列表中通过点运算符(.)和成员名的形式(.fieldname= value)来指定初始化其中的某些成员。

    举例,如清单4: 

[cpp] view plaincopy
  1. #include <stdio.h>  
  2.   
  3. struct mystruct {  
  4.     int num;  
  5.     char ch;  
  6.     float fl;  
  7. };  
  8.   
  9. int main(void)  
  10. {  
  11.     struct mystruct mystruct = { .ch ='M' };  
  12.   
  13.     printf(" num = %d\n ch = %c\n fl = %f\n",   
  14.         mystruct.num, mystruct.ch, mystruct.fl);  
  15.   
  16.     return 0;  
  17. }  

    例子输出结果: 

[cpp] view plaincopy
  1. num = 0  
  2. ch = M  
  3. fl = 0.000000  

    前面两个说明中的特点同样适用于结构体变量。

    注意:旧式的GCC 2.5编译器还使用过以下的形式(成员名加冒号)来初始化指定的结构体成员: 

[cpp] view plaincopy
  1. struct point { int x, y; };  
  2. struct point p = { y: yvalue, x: xvalue };  

    在联合体(共用体)中也可以使用指定初始化项目的特性,如: 

[cpp] view plaincopy
  1. union foo { int i; double d; };  
  2. union foo f = { .d = 4 };  

0 0