3

我想知道__attribute__((selectany))在 linux 中是否有替代方案?

我想定义类似的东西:

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

在头文件中并将其包含在许多将链接在一起的 .c 文件中。因此链接器将看到多个“a”的定义,因此不会链接。我读过这个属性(selectany),它只使用第一次看到的“a”定义,不幸的是它只适用于ms windows。所以问题是:在 linux 中是否有替代方法?

编辑:实际的问题是:有没有办法指示链接器仅使用第一次看到的定义并忽略任何其他定义,即使它们不同?我知道有很多方法可以定义我的数据,我不是在寻找如何定义我的数据的解决方案,而是我想知道是否有一种方法可以有多个定义并使链接器与第一个看到的一起工作。 ..

4

4 回答 4

6

我认为您正在寻找“弱” gcc 属性。

于 2015-06-16T13:49:41.637 回答
2

首先,你应该明确地给它一个const属性:

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

修改字符串文字会导致未定义的行为。然后回答你的问题,至少部分。

除了extern像以前的答案那样声明它的方法之外,第一个不推荐的方法是声明你的 array static。然后,您将在使用该数组的每个编译单元中拥有该数组的副本。只要您不想修改数组的内容(让指针指向不同的字符串),这很好,但会使您的代码有些混乱。

如果您只需要在函数范围内引用字符串并且您有一个符合 C99 的编译器,您可以考虑使用复合文字

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

然后,您可以按照预期使用readonlyMYARRAY[1],任何像样的编译器都应该能够优化这种访问。

于 2011-01-28T11:11:59.517 回答
0

为什么不简单地在标题中声明它,并在一个翻译单元中提供一个定义?

于 2011-01-28T09:34:53.750 回答
0

在标题中声明为:

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

然后只在一个 c 文件中定义实际的 a[] :

char * a[] = { ... }
于 2011-01-28T09:38:48.380 回答