首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >静态库中的函数可以访问吗?这些函数没有在头文件中公开。

静态库中的函数可以访问吗?这些函数没有在头文件中公开。
EN

Stack Overflow用户
提问于 2013-03-06 03:27:58
回答 3查看 236关注 0票数 0

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

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

EN

回答 3

Stack Overflow用户

发布于 2013-03-06 03:30:00

它取决于函数的链接:

代码语言:javascript
复制
//.c file

// external linkage, accessible from outside using the right prototype
void foo(void) {}

// internal linkage, not accessible from outside
static void bar(void) {}
票数 5
EN

Stack Overflow用户

发布于 2013-03-06 03:51:24

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-03-06 04:11:55

你的问题的解决方案是为你的库定义一些前缀,例如ouah_,并给所有函数/变量以它为前缀的名称,除非你可以将它们设置为static (即,只在定义它们的文件中可见)。不,它不能确保不会有名称冲突,但它应该会大大减少它们。比如Doug Gwin的Q8背后的原因。

这个BTW是C++中namespace的原因,也是OOP及其属于“类”的“方法”/“成员函数”的部分原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15232444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档