簡體   English   中英

替代在頭文件中為c中的“錯誤解引用指向不完整類型的指針”定義結構

[英]alternative to defining struct in header file for 'error dereferencing pointer to incomplete type' in c

我知道關於此還有其他問題,它們通常指向在頭文件中聲明和定義structtypedef struct的標准解決方案。 但是,我正在查看標頭中包含某人的其他代碼:

struct A;
typedef struct A A_t;

然后在* .c文件中定義結構A以及其他功能的實現。 A的實現包括很多定義,等等也都包含在* .c中,而不包含在頭文件中。

然后在main.c中包含標頭,並且我聲明和定義了新函數,它們使用了指向A_t的(空)指針,當嘗試訪問該結構的成員時,該error dereferencing pointer to incomplete typeerror dereferencing pointer to incomplete type

在這種情況下,是否還有其他方法可以在標頭中聲明和定義struct和typedef?

編輯:只是為了澄清原始代碼預見到用戶創建了一些函數,然后將這些函數傳遞給主例程。 例如,用戶應該創建一個函數來連接到套接字,關閉套接字連接,發送和接收數據。 因為我需要套接字的標識符/文件描述符,所以我在A的定義中添加了一個int ,這是我不能取消引用的。 我希望這可以澄清上下文。

您有兩個基本選擇:

  1. 在頭文件中定義該結構及其所有成員,以包括在使用此結構的所有.c文件中。
  2. 將結構的定義保留在特定的.c文件中,該文件還將包括訪問其成員的所有函數的定義,並且可以在標頭文件中聲明這些函數,以將其包含在需要操縱該結構的其他.c文件中。 當然,您仍然可以在其他.c文件中使用指向此結構的指針 ,但是您將無法訪問其成員。 可以將這種方法視為C提供某種封裝信息隱藏的一種方法

如果有人用這種方式編寫了代碼,並且您認為某人是一個足夠體面的程序員,那么他可能是故意這樣做的。

在適當的C API設計中,您可能需要公開一個指向內部數據結構的指針,以便能夠在函數調用中存儲上下文,並期望您的庫用戶從您那里收到該指針,進行存儲並將其返回下次調用您的資料庫。

在這種情況下,最簡單的答案是:不會讓您弄亂該指針,也不會希望自己分配這些結構之一,也不會取消對它的指針的引用。 X11是一個著名的例子。

如果實際上需要能夠取消引用此類指針或訪問結構成員,則需要訪問某些頭文件中的完整結構定義。 您選擇要放置定義的位置,可以有多個(即沒有“ the”頭文件之類的東西)頭。

編輯之后,我建議您這樣做:

顯然,您的庫的創建者已經非常注意不要在其模塊之外公開該結構-我會這樣。

您需要向結構中添加一個int並已這樣做,因此您顯然可以訪問.c源。 這樣做,將其放入C文件,並在其中保留結構定義。 添加一個setInt(struct A*, int)和一個getInt(struct A*)函數,該函數允許您從這樣的不透明指針(getter和setter函數)中設置和檢索int 在C文件的標題中公開這兩個函數。 這保留了信息隱藏的初衷,但仍然允許您擴展結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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