1. 程式人生 > >C語言結構體的前向宣告,以及結構體巢狀const結構體成員的問題

C語言結構體的前向宣告,以及結構體巢狀const結構體成員的問題

如果你在宣告一個結構體A時,要使用一個未宣告的結構體B時,該怎麼辦?如下:

#include <stdio.h>

typedef struct demo{
    struct stu test;
    const int test2;
    int test3;
}demo_t;

struct stu{
    const int a;
    int b;
};

int main()
{
   printf("Hello, World! \n");
   
   return 0;
}

編譯報錯:/tmp/499466774/main.c:4:16: error: field has incomplete type 'struct stu'
    struct stu test;
               ^
/tmp/499466774/main.c:4:12: note: forward declaration of 'struct stu'
    struct stu test;

使用了未宣告的型別。

這時就可以用到結構體的前向宣告:

#include <stdio.h>

typedef struct stu str_t;

typedef struct demo{
    const str_t* test; /*注意此處必須為指標型別,因為前向宣告並沒有指出該型別的大小,所以在定義時使用結構體變數無法得知該結構體的大小*/
    const int test2;
    int test3;
}demo_t;

struct stu{
    const int a;
    int b;
};

int main()
{

  demo_t  dem_test;

  dem_test.test = (str_t *)  malloc(sizeof(str_t));

  //dem_test.test->b =1;
   printf("Hello, World! \n");
   
   return 0;
}

還沒完呢!

有沒有注意到如果此時你要給demo_t的test成員的b賦值時,根本賦值不了,因為test是const型別的結構體它的成員都是隻讀的,const型別在定義時就應該初始化比如 const int a =1;系統預設會給定義的變數初始化,所以const必須在定義時就初始化。

此時一個的解決方案就是你自己定義一個struct stu 的變數,讓demo_t的test指標

指向它,這樣就不會出現問題了。

這裡貼出最終的程式碼:

#include <stdio.h>

typedef struct stu str_t;

typedef struct demo{
    const str_t* test;
    const int test2;
    int test3;
}demo_t;

struct stu{
    const int a;
    int b;
};

int main()
{
    str_t *str_test;
    str_test =(str_t *) malloc (sizeof(str_t));
    demo_t dem_test;
    dem_test.test = str_test;
   printf("Hello, World! \n");
   
   return 0;
}