我知道如果找不到函数的原型,就会产生一个编译器错误。但是假设我知道一个库包含一些非公共函数,并且我为它创建了自己的原型(与静态库中的原型相匹配),那么链接器能够将其引入吗?
我问这个问题的原因是,我正在创建一个库,其中对函数使用通用的通用名称,如"init()",这些名称仅供内部使用。我想知道在链接过程中,它们是否会与库之外的符号发生冲突
发布于 2013-03-06 03:30:00
它取决于函数的链接:
//.c file
// external linkage, accessible from outside using the right prototype
void foo(void) {}
// internal linkage, not accessible from outside
static void bar(void) {}发布于 2013-03-06 03:51:24
原型的目的是为了编译器,而不是链接器。编译器会很高兴地编译您声明的任何函数的代码,但如果您尝试使用在另一个文件或库中定义为静态的函数,则会得到一个链接器错误。
如果您不想在文件外部使用您自己的函数,那么您可以也应该将它们声明为静态函数。但是,如果您随后使用包含具有相同函数名的声明的其他代码进行编译,您将会得到冲突,除非它们都是以相同的方式定义的。例如,如果您将init函数定义为静态函数,那么它将只在该文件中直接可用;但是,如果您包含的任何头文件以不同的方式声明了另一个名称为init的函数,则会得到一个错误。
(可以访问另一个文件中的静态函数,但它需要指针。)
发布于 2013-03-06 04:11:55
你的问题的解决方案是为你的库定义一些前缀,例如ouah_,并给所有函数/变量以它为前缀的名称,除非你可以将它们设置为static (即,只在定义它们的文件中可见)。不,它不能确保不会有名称冲突,但它应该会大大减少它们。比如Doug Gwin的Q8背后的原因。
这个BTW是C++中namespace的原因,也是OOP及其属于“类”的“方法”/“成员函数”的部分原因。
https://stackoverflow.com/questions/15232444
复制相似问题