[英]Incomplete type when dereferencing pointer C
我有一個給出定義的頭文件
typedef struct dyn_array dyn_array_t
我有一個實現它的.c文件
struct dyn_array {
size_t size;
void* array;
};
在另一個.c文件中,我將此類型的指針傳遞給函數。
bool first_come_first_serve(dyn_array_t* ready_queue){
size_t limit = ready_queue->size;
//...
}
我無法弄清楚我在做什么錯。
另一個.c文件看不到struct dyn_array
定義。 它對size
成員沒有任何了解。
如果需要多個.c文件來了解結構,請將以下內容移至.h文件
struct dyn_array {
size_t size;
void* array;
};
另一種方法是創建一個獲取成員的函數,並將dyn_array_t
的定義保留在dyn_array.c
。 這是信息隱藏 -一個好的設計目標。
// in dyn_array.h
typedef struct dyn_array dyn_array_t;
size_t get_size(const dyn_array_t* ready_queue);
// in different.c
#include <dyn_array.h>
bool first_come_first_serve(dyn_array_t* ready_queue){
size_t limit = get_size(ready_queue);
//...
}
// in dyn_array.c
#include <dyn_array.h>
struct dyn_array {
size_t size;
void* array;
};
size_t get_size(const dyn_array_t* ready_queue) {
return ready_queue->size;
}
“不完整的類型”表示您僅聲明/使用了該類型,而沒有對其進行解釋。 您的第二個.c
文件可能#include "ah"
但請注意dyn_array
的定義在ac
而不是ah
要解決此問題, dyn_array
在ah
聲明並定義dyn_array
:
struct dyn_array {
size_t size;
void* array;
};
編譯器需要完成類型定義,才能取消指向它的指針並訪問其字段。 您必須將類型定義放在標頭中(可能與用於放置typedef
聲明的標頭不同),並將其也包含在第二個文件中,以便能夠通過指針進行訪問。 編譯器允許您訪問不完整類型定義的指針,只要您不需要該類型的詳細信息即可。 與第二個文件一樣,編譯器對結構的構造一無所知,因此無法訪問size
字段。
如果您需要代碼的某些部分無法訪問數據類型的內部詳細信息,而其他部分完全了解它,則可以准備兩個頭文件(一個公共文件,另一個私有文件),如下所示:
typedef struct dyn_array dyn_array_t;
size_t get_size(const dyn_array_t* ready_queue);
#include "dynarry.h"
struct dyn_array {
size_t size;
void *array;
};
然后,在用作客戶端的模塊中,該庫僅包含"dynarry.h"
,而在內部實現中,您#include "dynarryP.h"
。 關於隱藏內部實現細節 ,這有點類似於面向對象的編程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.