是否可以访问未在标题中公开的静态库中的函数?

时间:2013-03-05 19:27:58

标签: c

我知道如果找不到该函数的原型,将生成编译器错误。但是让我说我​​知道一个库包含一些非公共函数,并且我为它创建了自己的原型(匹配静态库中的一个),链接器是否可以将其拉入其中?

我问的原因是我正在创建一个库,我正在使用函数的通用通用名称,例如“init()”,它们仅供内部使用。我想知道在链接期间它们是否会与库外的符号碰撞

3 个答案:

答案 0 :(得分:5)

它取决于功能的联系:

//.c file

// external linkage, accessible from outside using the right prototype
void foo(void) {}

// internal linkage, not accessible from outside
static void bar(void) {}

答案 1 :(得分:0)

原型是为了编译器而不是链接器。编译器将很乐意为您声明的任何函数编译代码,但如果您尝试使用在另一个文件或库中定义为static的函数,则会出现链接器错误。

如果不在文件之外使用,您可以而且应该将自己的函数声明为静态函数。但是,如果您随后使用包含具有相同函数名称的声明的其他代码进行编译,则会发生冲突,除非它们的定义完全相同。例如,如果您将init函数定义为静态函数,则只能在该文件中直接使用它;但如果你包含任何声明另一个函数的头文件,名称为init,则会出现错误。

(可以在另一个文件中访问静态函数,但它需要指针。)

答案 2 :(得分:0)

您的问题的解决方案是为您的库定义一些前缀,例如ouah_并给出所有以它为前缀的函数/变量名称,除非你可以使它们static(即,只在定义它们的文件中可见)。不,它不会确保没有名称冲突,但它应该减少很多。就像Doug Gwin的Q8 ... {/ p>背后的原因一样

这个BTW是使C ++中的namespace事物变得混乱的原因,也部分归咎于OOP及其"方法" /"成员函数"属于"类"