我想知道Linux中是否有__attribute__((selectany))
的替代方案?
我想定义类似的内容:
char * a[] = { "qwe", "zxc" };
在头文件中并将其包含在许多将链接在一起的.c文件中。 所以链接器将看到多个“a”的定义,因此不会链接。我已经读过这个属性(selectany),它只会使用第一个看到的“a”定义,不幸的是它只适用于ms窗口。 所以问题是:linux中有替代方法吗?
编辑:实际问题是:有没有办法指示链接器只使用第一个看到的定义并忽略其他任何定义,即使它们不同? 我知道有很多方法来定义我的数据,我不是在寻找如何定义我的数据的解决方案,而是我想知道是否有一种方法可以有多个定义并使链接器与第一个看到的一起工作。 ..
答案 0 :(得分:4)
我认为你正在寻找'弱'的gcc属性。
答案 1 :(得分:2)
首先,你应该明确地给它一个const
属性:
char const * a[] = { "qwe", "zxc" };
修改字符串文字会导致未定义的行为。然后至少部分地回答你的问题。
除了在前面的答案中声明它extern
的方法之外,第一个(不推荐)继续进行的方法是声明你的数组static
。然后,您将在每个使用该数组的编译单元中获得该数组的副本。只要你不想修改数组的内容(让指针指向不同的字符串),这很好,但是会稍微破坏你的代码。
如果您只需要在函数范围中引用字符串并且您有一个符合C99的编译器,那么可以使用复合文字进行查看:
#define MYARRAY ((char const*const[]){ "qwe", "zxc" })
然后你就可以像预期的那样使用 readonly ,类似于MYARRAY[1]
,任何体面的编译器都应该能够优化这种访问。
答案 2 :(得分:0)
为什么不简单地在标题中声明它,并在一个翻译单元中提供单个定义?
答案 3 :(得分:0)
如何在标题中声明:
extern char * a[] = { ... }
然后在一个c文件中定义实际的a []:
char * a[] = { ... }