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;
}