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

    前言:計算機語言是編譯器和程序員交流的依據和規範,GNU C是GCC特有的功能,在Linux內核中被普遍應用。 html

    幫助文檔:http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/C-Extensions.html#C-Extensions 程序員

 

    指定初始化項目(Designated Initializers):指的是能夠對數組中的某些元素或結構體變量中的某些成員以任意的順序進行選擇性的初始化。 數組

    一、在數組中的應用 app

    在數組的初始化列表中使用「[index]= value」這樣的形式便可實現對指定(經過index指定)的某個元素進行初始化。 spa

    舉例,如清單1:  .net

[cpp]  view plain copy
  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 plain copy
  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。 htm

    說明(1):若是在一個指定初始化項目後跟有不止一個值,如例子中的[3] =29, 18,則這些多餘的數值將用來對後續的數組元素進行初始化,即數值18用來初始化arr[4]。 blog

    提醒:對C語言數組來講,在初始化一個或多個元素後,其中未經初始化的元素都將被自動地初始化爲0或者NULL(針對指針變量而言)。未通過任何初始化的數組,其全部元素的值都將是不肯定的(針對局部變量而言)。 ip

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

[cpp]  view plain copy
  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 plain copy
  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 plain copy
  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 plain copy
  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  

    二、在結構體變量中的應用

    在結構體變量的初始化列表中經過點運算符(.)和成員名的形式(.fieldname= value)來指定初始化其中的某些成員。

    舉例,如清單4: 

[cpp]  view plain copy
  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 plain copy
  1. num = 0  
  2. ch = M  
  3. fl = 0.000000  

    前面兩個說明中的特色一樣適用於結構體變量。

    注意:舊式的GCC 2.5編譯器還使用過如下的形式(成員名加冒號)來初始化指定的結構體成員: 

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

    在聯合體(共用體)中也可使用指定初始化項目的特性,如: 

[cpp]  view plain copy
  1. union foo { int i; double d; };  
  2. union foo f = { .d = 4 };  
相關文章
相關標籤/搜索