2011-01-28 67 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]和任何体面的编译器应该能够优化这样的访问。