0

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

我问的原因是我正在创建一个库,我在其中使用函数的通用通用名称,例如“init()”,这些名称仅供内部使用。我想知道在链接过程中它们是否会与库外的符号发生冲突

4

3 回答 3

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) {}
于 2013-03-05T19:29:59.543 回答
0

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

这个 BTW 是namespaceC++ 中存在的原因,也部分归咎于 OOP 及其属于“类”的“方法”/“成员函数”

于 2013-03-05T20:11:54.947 回答
0

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

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

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

于 2013-03-05T19:51:23.697 回答