我知道如果没有找到该函数的原型,将会产生编译器错误。但是让我说我知道一个库包含一些非公共函数,并且我为它创建了自己的原型(匹配静态库中的一个),链接器是否能够将其拉入?函数是否在静态库中,不在头中公开,可访问?
我问的原因是我创建了一个库,我在这里为函数使用通用通用名称,比如“init()”,它们只用于内部使用。我不知道他们是否会连接
我知道如果没有找到该函数的原型,将会产生编译器错误。但是让我说我知道一个库包含一些非公共函数,并且我为它创建了自己的原型(匹配静态库中的一个),链接器是否能够将其拉入?函数是否在静态库中,不在头中公开,可访问?
我问的原因是我创建了一个库,我在这里为函数使用通用通用名称,比如“init()”,它们只用于内部使用。我不知道他们是否会连接
其在与库之外的符号碰撞依赖于功能的联动:
//.c file
// external linkage, accessible from outside using the right prototype
void foo(void) {}
// internal linkage, not accessible from outside
static void bar(void) {}
原型是编译器,而不是连接器的好处。编译器会高兴地编译你声明的任何函数的代码,但如果你试图使用在另一个文件或库中定义为静态的函数,你会得到一个链接器错误。
如果不能在文件之外使用,则可以并且应该将自己的函数声明为静态函数。但是,如果您随后使用其他包含具有相同函数名称的声明的代码进行编译,则会发生冲突,除非它们的定义完全相同。例如,如果您将init
函数定义为静态函数,则只能在该文件中直接使用它;但是如果你包含任何声明另一个函数的头文件,名称为init
,你会得到一个错误。
(可以访问在另一个文件中的静态功能,但它需要的指针。)
如果您将几个文件全部定义为相同的名称'static',则什么都不会发生,'static'使得名称具有文件范围(即在别处不可见)。 – vonbrand 2013-03-05 20:05:41
@ vonbrand:假设声明了不同的函数,你会得到一个错误的声明错误。除非我猜测所有相同的函数名称都是以完全相同的方式定义的。 – teppic 2013-03-05 20:08:04
请尝试。你会发现''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
你的问题的解决方案是定义一些前缀为您的库,例如ouah_
并给出以它为前缀的所有函数/变量名称,除非您可以使它们成为static
(即仅在它们被定义的文件中可见)。不,它不会确保没有名称冲突,但它应该减少很多。像背后的原因道格Gwin的Q8 ......
这BTW是在C++ behing的namespace
事情的原因,也有一部分要归咎于OOP和它的“方法” /“成员函数”属于“类”
谢谢。如果我在一个文件中只有一个文件中有一个函数,那么我只能通过另一个文件访问它,但除此之外别无它法。处理这个问题的最好方法是什么? – 2013-03-05 19:35:43
@BrandonYates您不能在C中执行此操作。 – ouah 2013-03-05 19:40:35