2013-07-04 19 views
2

我有一個龐大的type-def數組,我希望它可以跨多個c文件訪問。 type-def的定義在頭文件中。什麼是共享數據的最佳方法..我應該將其存儲在頭文件還是存儲在c文件中?C中使用多個文件的數據存儲

方法我

project.h 
--------- 
typedef struct td_myproject{ 
    lot of fields .... 
} td_myproject; 

projectdata.h 
------------- 
include "project.h" 

td_myproject myproject[] = { 
    over 100k of recs with data filled before compilation 
} 

myproject.c 
----------- 
include "project.h" 
include "projectdata.h" 
(with proper guard usage) 

print(%s",myproject[0].field1); 

方法2

project.h 
--------- 
typedef struct td_myproject{ 
    lot of fields .... 
} td_myproject; 

projectdata.c 
------------- 
include "project.h" 

td_myproject myproject[] = { 
    over 100k of recs with data filled before compilation 
} 

myproject.c 
----------- 
include "project.h" 
(with proper guard usage) 

print(%s",myproject[0].field1); 
+0

數據是靜態的還是有可能改變? – wmorrison365

回答

3

就個人而言,這確實是一個個人的選擇,我會存儲數據在其自己的C文件(myproject[])。

爲什麼?

因爲概念上的頭文件應該用於常量(用於編譯,而不是存儲)和定義。

另一方面,代碼文件由數據和代碼組成。最終將代碼文件編譯成目標文件,然後鏈接程序加入這些目標文件之間的引用。代碼和數據都是被引用的項目 - 邏輯上 - 如果你的數據在一個C文件中,然後它成爲一個目標文件,它將被另一個目標文件(從C文件)引用。

對於我來說,測試頭文件中是否有某些東西可以放在兩個單獨的C文件中是否可以包含該文件並且仍然是鏈接。在這種情況下 - 如果包含在兩個不同的C文件中,將靜態變量放在頭文件中會斷開連接。

那麼如何最好地解決這個問題呢?

頭文件myproject.h

include "project.h" 

/* define variable type, and the fact it needs to be linked in */ 
extern td_myproject myproject[]; 

代碼文件myprojectdata.c

#include "myproject.h" 

/* actually define contents of variable in this unit */ 
td_myproject myproject[] = { ... }; 

這樣做的好處是,你可以從其他C文件僅僅是通過包含myproject.h然後引用myproject[]

代碼文件myproject.c

#include "myproject.h" 

int main(void) { 
    print("%s",myproject[0].field1); 
} 

鏈接:

gcc -o myproject myproject.c myprojectdata.c 
+1

謝謝!!!欣賞快速和精心的答案。 –

0

我在第一種方法看到的是,在文件在MyProject.C你既包括.h文件,與

包括「project.h」 包括「projectdata.h」

但是你的「projectdata.h」已經包含了「project.h」,所以你可能想從你的.c文件中刪除一個包含「project.h」的實例。

然後在approad II中,myproject.c如何知道myproject []是什麼。那麼如何在myproject.c中聲明myproject [] extern,因爲它已經在projectdata.c中聲明瞭?