簡體   English   中英

取消引用指針C時的類型不完整

[英]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_arrayah聲明並定義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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM