2013-03-05 50 views
0

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

我问的原因是我创建了一个库,我在这里为函数使用通用通用名称,比如“init()”,它们只用于内部使用。我不知道他们是否会连接

回答

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) {} 
+0

谢谢。如果我在一个文件中只有一个文件中有一个函数,那么我只能通过另一个文件访问它,但除此之外别无它法。处理这个问题的最好方法是什么? – 2013-03-05 19:35:43

+3

@BrandonYates您不能在C中执行此操作。 – ouah 2013-03-05 19:40:35

0

原型是编译器,而不是连接器的好处。编译器会高兴地编译你声明的任何函数的代码,但如果你试图使用在另一个文件或库中定义为静态的函数,你会得到一个链接器错误。

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

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

+0

如果您将几个文件全部定义为相同的名称'static',则什么都不会发生,'static'使得名称具有文件范围(即在别处不可见)。 – vonbrand 2013-03-05 20:05:41

+0

@ vonbrand:假设声明了不同的函数,你会得到一个错误的声明错误。除非我猜测所有相同的函数名称都是以完全相同的方式定义的。 – teppic 2013-03-05 20:08:04

+0

请尝试。你会发现''a.c'中的'static double foo(double)'完全独立于'b.c'中的'static int foo'和'c.c'中的'static unsigned long foo(int,char *)'。如果没有,你的C堆栈被破坏得很大,得到一个体面的操作系统。 – vonbrand 2013-03-05 20:14:34

0

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

这BTW是在C++ behing的namespace事情的原因,也有一部分要归咎于OOP和它的“方法” /“成员函数”属于“类”

相关问题