2011-01-28 71 views
2

我想知道在linux中是否有__attribute__((selectany))的替代方案?gcc __attribute __((selectany))for linux的替代方案?

我想定義類似的東西:

char * a[] = { "qwe", "zxc" }; 
在頭文件

並將其包含在其中會被連接在一起的許多.c文件。 所以鏈接器將看到多個「a」的定義,因此不會鏈接。我讀過這個屬性(selectany),它只使用第一個看到的「a」的定義,不幸的是它只適用於ms窗口。 所以問題是:在linux中是否有其他方法?

編輯:實際的問題是:有沒有辦法指示鏈接器只使用第一個看到的定義,並忽略其他任何其他可能即使它們不同? 我知道有很多方法來定義我的數據,我不是在尋找如何定義我的數據的解決方案,而是我想知道是否有一種方法可以有多個定義,並使鏈接器與第一次看到的工作...

+1

這很有趣,你可以分享你想要最終完成的事情嗎?我明白這個問題,讀完後我只是好奇而已。 – 2011-01-28 11:12:26

+0

我有一些類型的枚舉(例如:STRING,INTEGER,FLOAT等)。因爲你知道類型的值是整數...我需要一個類型的字符串表示,所以這裏來了char * type_names [] = {[STRING] =「string」,...},但正如你可以想象的,我需要在頭文件中的枚舉器附近的定義,所以我把它定義爲靜態const char * [],其周圍有#ifdef INCLUDE_TYPE_NAMES,但是我很好奇如果有一種方法可以在所描述的(在問題中)的方式。 – 0xAF 2011-01-31 10:04:09

回答

3

我認爲你正在尋找'weak'gcc屬性。

0

爲什麼不簡單地在頭文件中聲明它,並在一個翻譯單元中提供單個定義?

+0

有很多解決方案,只是好奇,如果有這樣的解決方案... – 0xAF 2011-01-28 09:40:21

0

怎麼樣在頭聲明爲:

extern char * a[] = { ... } 

,然後定義實際的一個[]中只有一個C文件:

char * a[] = { ... } 
+0

+1:在頭文件中定義數據不是一個好的做法。 – 2011-01-28 09:41:25

+0

@Blagovest,這不是好主意是的,但仍然如果你想保持多個數據類型同步...我知道有很多解決方案,但是有一個屬性或其他方法來指示鏈接器只使用一個定義時有多重? – 0xAF 2011-01-28 09:51:48

2

首先,你應該明確地給它一個const屬性:

char const * a[] = { "qwe", "zxc" }; 

修改字符串文字會導致未定義的行爲。然後至少部分回答你的問題。

除了像之前的答案一樣聲明它的方法extern,第一種不推薦的方法是聲明數組static。然後,您將在每個使用該數組的編譯單元中擁有該數組的副本。只要你不想修改數組的內容(讓指針指向不同的字符串),這沒什麼問題,但會讓你的代碼變得有點暴躁。

如果您只是需要引用函數範圍琴絃,你有一個符合C99編譯器,你可以考慮使用複合文字

#define MYARRAY ((char const*const[]){ "qwe", "zxc" }) 

這你可以再使用只讀爲你會期望,像MYARRAY[1]和任何體面的編譯器應該能夠優化這樣的訪問。