2012-02-08 306 views
8

我有許多不同的3軸傳感器,我正在編寫測試代碼。在C文件爲他們每個人,我所定義的相同字符的字符串:如何在頭文件中定義字符串數組?

char axis[3][8] = {"X", "Y", "Z"} 

,我用我的「for」循環的結果來打印失敗這樣的軸:

DEVICETEST_LOG("%s Failed %s axis for Min range\n",device_name[DUT], axis[i]); 

我在想,爲了節省一些空間,我可以在頭文件中定義一個字符串數組,以便在整個地方使用。

我已經嘗試了一些東西,但我似乎無法得到在我的頭文件中定義的字符串數組,我可以通過迭代來傳遞一個編譯。

回答

10

爲了避免鏈接錯誤,你必須聲明你的陣列作爲一個頭文件extern,然後在你的代碼模塊一個定義數組一次

因此,例如:

//myheader.h 
extern const char* axis[3]; 

然後在另一個代碼模塊的地方:

//myfile.c 
const char* axis[3] = { "X", "Y", "Z" }; 
+0

啊,這是有道理的,但似乎bassackwards ...因此,我包括頭文件指向所有其他C文件到「myfile.c」本地定義。 – user1054210 2012-02-08 16:04:44

+0

因此,即使我已經將頭文件包含在其他c文件中,我也收到了一個「undefined refrence」的編譯錯誤。所以在myheader.h中,我有>> extern char * AXIS [3] [8];在myfile.c中我有>> char * AXIS [3] [8] = {{「X」},{「Y」},{「Z」}};我在otherfile.c中包含myheader.h。我也嘗試了一些其他的技巧,但他們不同步。 – user1054210 2012-02-08 16:52:01

+0

還有其他的東西是錯的,那麼因爲這確實有效......如果你把宏從等式中拿出來而只是嘗試訪問另一個包含頭文件的代碼模塊中的數組,那麼會發生什麼?其次,它應該只是'const char * AXIS [3] = {「X」,「Y」,「Z」};'因爲這些是字符串文字...你從哪裏得到'8'? – Jason 2012-02-08 17:06:06

19

如果你必須把它放在一個頭文件,使用externstatic

// option 1 
// .h 
extern char axis[3][8]; 

// .c 
char axis[3][8] = { "X", "Y", "Z" }; 

// option 2 
// .h 
static char axis[3][8] = { "X", "Y", "Z" }; 

Extern告訴鏈接器有一個全局變量axis在我們的一個實現文件中定義(即在一個.c文件),我需要在這裏引用。另一方面,告訴編譯器相反:我需要能夠看到和使用這個變量,但不要將它導出到鏈接器,所以它不能被extern或引用引用。命名衝突。

2

把這個在你的頭文件

extern char axis[3][8]; 

,並保持這在C文件中:

char axis[3][8] = {"X", "Y", "Z"}; 
2

添加到您的標題:

extern char *axis[]; 

一下添加到一個源文件在您的項目中:

char *axis[] = { "X", "Y", "Z", "Time", "Space", "The Scary Door" }; 
+0

幹得好!當我需要創建一個包含無限元素的菜單時,我會使用它。這是完美的,因爲在編譯時編譯器確切地設置了數組的長度,而且代碼似乎更具可讀性。 – b3h3m0th 2015-12-19 17:35:30

0

Michael Barr(Netrino)建議不要在頭文件中存儲聲明。同樣,Netrino嵌入式系統編碼標準也不允許在頭文件中使用外部存儲。

我通常會同意這些原則,並且我發現將外存存儲到需要它的C文件中是一個不錯的主意,而且只有這些原則纔是存儲的。

相關問題