2016-10-07 43 views
0

我正在寫一個c項目,我試圖保留在相關的.h文件中的所有結構聲明。這允許我通過包含相關頭文件在任何.c文件中使用它們。 我也避免將我的項目的頭文件包含在其他頭文件中。我想這會讓代碼更易於閱讀和維護。當struct在另一個文件中聲明時如何使用struct作爲函數的參數?

我的問題是如何避免在頭文件中包含使用該結構的頭文件中包含結構聲明的頭文件。有沒有辦法做到這一點? (我沒有找到答案,對不起,如果它重複)。 這裏是一個片段:

cmd.c

#include "cmd.h" 
#include "params.h"  //This allows usage of struct testPars 

void move_parameters(struct testPars *testP) { 
... 
} 

cmd.h

#ifndef CMD_H 
#define CMD_H 
#include "params.h"  //I want to avoid this include in this file 

void move_parameters(struct testPars *testP) ; 
#endif 

params.h

#ifndef PARAMS_H 
#define PARAMS_H 

struct testPars { 
    char name[16]; 
    double value; 
}; 
#endif 
+3

您可以在cmd.h中寫入前向聲明'struct testPars;'而不是include。 – mch

+0

這很無意義。只需包含包含結構定義的頭文件即可。 –

回答

0

總體而言,有一個關於適當的程序很多的困惑這裏設計。

我試圖保留在相關的.h文件中的所有結構聲明。這允許我通過包含相關頭文件在任何.c文件中使用它們。

這是可接受的練習,用於快速&骯髒的編程,你沒有私人封裝,或者如果結構是簡單的性質。

但是對於結構代表更復雜的ADT等的專業程序,您應該只在頭文件中保留一個前向聲明,並在相應的c文件中定義結構。這導致私有封裝和模塊化,即良好的程序設計。 (搜索「不透明型」或「不透明指針」,例如此類前瞻性聲明的正式用語是不完全的類型。)

你正在嘗試做聽起來像上面卻完全向後:暴露的定義給調用者,但不要自己使用它。顯然,你不能使用你沒有包括在內的結構,因爲這沒有任何意義。

我也避免將我的項目的頭文件包含在其他頭文件中。我想這會讓代碼更易於閱讀和維護。

這是一個壞主意。您的每個頭文件都將被視爲相應c文件的公開文檔以及如何使用它。雖然c文件可以被視爲私人數據,但內容並不是調用者應該關注的內容。

該頭文件文檔的一個重要部分是列出該模塊具有的所有依賴關係,以便其他程序員可以快速瀏覽一下頭文件的頂部並立即分辨需要編譯哪些文件這個特定的模塊。

良好的程序設計儘量少依賴:「鬆耦合」。因此,所有#includes都被視爲應放在頭文件頂部的重要信息。不應該包含未使用的頭文件。

除了自己的頭文件,c文件不應包含任何包含。

+0

感謝大家。我只是將我的代碼更改爲在.h文件中使用前向聲明,並且它完美地工作,現在更清晰。 –

相關問題