我知道如果找不到该函数的原型,将生成编译器错误。但是假设我知道一个库包含一些非公共函数,并且我为它创建了自己的原型(与静态库中的那个匹配),链接器能否将其拉入?
我问的原因是我正在创建一个库,我在其中使用函数的通用通用名称,例如“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) {}
解决您的问题的方法是为您的库定义一些前缀,例如ouah_
,并为所有函数/变量名称提供前缀,除非您可以制作它们static
(即,仅在定义它们的文件中可见)。不,它不能确保没有名称冲突,但它应该会减少很多。就像Doug Gwin Q8背后的原因一样......
这个 BTW 是namespace
C++ 中存在的原因,也部分归咎于 OOP 及其属于“类”的“方法”/“成员函数”
原型是为了编译器的利益,而不是链接器。编译器会很高兴地为您声明的任何函数编译代码,但是如果您尝试使用在另一个文件或库中定义为静态的函数,则会出现链接器错误。
您可以并且应该将您自己的函数声明为静态函数,如果它们不在文件之外使用的话。但是,如果您随后使用包含具有相同函数名称的声明的其他代码进行编译,则会出现冲突,除非它们的定义都相同。例如,如果您将init
函数定义为静态,则它只能在该文件中直接使用;但是,如果您包含任何以不同方式声明另一个函数的头文件 name init
,您会收到错误消息。
(可以访问另一个文件中的静态函数,但它需要指针。)