C語言中的匿名結構體和聯合體



C語言中的匿名結構體和聯合體

匿名結構體和聯合體的功能是在C11標準中引入的。其目的是增強C語言的靈活性和在某些情況下避免不必要的命名。

定義匿名結構體和聯合體的功能已被證明非常有用,尤其是在涉及建立複雜資料結構、硬體暫存器對映等的應用程式中。這使得程式碼更簡潔易讀。

匿名結構體

匿名結構體是一個結構體定義,沒有標籤或typedef。它通常巢狀在另一個結構體中。

匿名結構體的語法

以下是定義匿名結構體的語法:

struct type {
   elem1;
   elem2;
   struct {
      elem3;
      elem4;
   };
};

訪問匿名結構體的成員

匿名結構體/聯合體的成員可以直接訪問父結構體,簡化了表示法。

示例1

在下面的程式碼中,我們定義了一個名為employee的結構體。在其中,一個匿名結構體用於儲存員工的出生日期、月份和年份。在巢狀結構體的示例中,我們有一個內部的dob結構體。現在我們將使用匿名結構體。

#include <stdio.h>

struct employee {
   char name[10];
   float salary;
   struct {
      int d, m, y;
   };
};

int main(){

   struct employee e1;
   strcpy (e1.name, "Kiran");
   e1.salary=25000;
   e1.d = 12;
   e1.m = 5;
   e1.y = 1990;

   printf("Name: %s\n", e1.name);
   printf("Salary: %f\n", e1.salary);
   printf("Date of Birth: %d-%d-%d\n", e1.d, e1.m, e1.y);
   
   return 0;
}

輸出

執行此程式碼後,將產生以下輸出:

Name: Kiran
Salary: 25000.000000
Date of Birth: 12-5-1990

請注意,內部匿名結構體的“d”、“m”和“y”元素可以直接訪問。

示例2

以下示例中的外部結構體型別為student,它包含一個巢狀的匿名結構體來儲存課程的標題和ID。

#include <stdio.h>

struct student {
   char name[10];
   int age;
   struct {
      char coursettl[20];
      int courseid;
   };
};

int main(){

   struct student s1;
   strcpy (s1.name, "Kiran");
   s1.age = 27;
   strcpy(s1.coursettl, "C Programming");
   s1.courseid=1;

   printf("Name: %s\n", s1.name);
   printf("age: %d\n", s1.age);
   printf("Course Title: %s Course ID: %d\n", s1.coursettl, s1.courseid);

   return 0;
}

輸出

執行此程式碼後,將產生以下輸出:

Name: Kiran
age: 27
Course Title: C Programming Course ID: 1

匿名聯合體

匿名聯合體是一種特殊的聯合體,它沒有名稱。與普通聯合體不同,匿名聯合體主要用於建立未命名的成員,可以直接訪問而無需使用聯合體名稱限定它們。

匿名聯合體的語法

以下是定義匿名聯合體的語法:

struct type {
   elem1;
   elem2;
   union {
      elem3;
      elem4;
   };
};

訪問匿名聯合體的成員

匿名聯合體的成員可以直接訪問,無需使用聯合體名稱。

示例

匿名聯合體沒有名稱。這些元素共享相同的記憶體位置。

請看下面的例子:

#include <stdio.h>

struct mystruct {
   int var;
   union {
      int var1;
      float var2;
      char var3;
   };
};

int main(){

   struct mystruct data;

   data.var = 10; 
   data.var2 = 5.55;

   printf("mystruct.var: %d\n", data.var);
   printf("anonymous union elements: %d %f %c", data.var1, data.var2, data.var3);

   return 0;
}

輸出

執行程式碼並檢查其輸出:

mystruct.var: 10
anonymous union elements: 1085381018 5.550000 �

注意:與普通聯合體一樣,匿名聯合體變數的未初始化成員也會顯示垃圾值。

匿名結構體和聯合體的優點

主要優點之一是可以直接訪問成員,無需任何內部結構體或聯合體名稱。這可以使程式碼更易讀。以下是使用匿名結構體和聯合體的其他一些優點:

  • 記憶體效率 - 與普通聯合體一樣,匿名聯合體允許不同資料型別共享相同的記憶體空間,從而產生更節省記憶體的程式碼,這在低記憶體環境中特別有用。
  • 靈活性 - 匿名結構體提供了表示和訪問資料方式的靈活性,允許更動態和通用的資料結構。
  • 便捷性 - 此功能允許對可以儲存不同資料型別的變數進行緊湊的表示。
  • 易於初始化 - 它們可能更容易初始化和使用,因為它們不需要宣告聯合體變數。

請注意,在C11標準之前,匿名結構體或聯合體型別不是C標準的一部分。因此,如果目標系統使用符合早期標準的編譯器,則程式碼中的使用可能會導致相容性問題。

廣告