阅读我的《Expert C Programming 》一书,我遇到了关于函数插入的章节,以及如果无意中这样做会导致一些严重的难以发现的错误。
书中给出的例子如下:
my_source.c
mktemp() { ... }
main() {
mktemp();
getwd();
}
库
mktemp(){ ... }
getwd(){ ...; mktemp(); ... }
根据这本书,发生的事情main()
是mktemp()
(一个标准的 C 库函数)被my_source.c中的实现插入。尽管main()
调用我的实现mktemp()
是预期行为,但getwd()
(另一个 C 库函数)也调用我的实现mktemp()
不是。
显然,这个例子是存在于 SunOS 4.0.3 版本的lpr
. 这本书继续解释解决方法是将关键字添加到my_source.cstatic
的定义mktemp()
中;尽管完全更改名称也应该可以解决此问题。
这一章给我留下了一些悬而未决的问题,希望你们能回答:
- GCC 有办法警告函数插入吗?我们当然不打算发生这种情况,如果发生这种情况,我想知道。
- 我们的软件组是否应该采取将关键字
static
放在我们不想暴露的所有功能前面的做法? - 静态库引入的函数可以进行插入吗?
谢谢您的帮助。
编辑
我应该注意,我的问题不仅旨在插入标准 C 库函数,还包括其他库中包含的函数,也许是第 3 方,也许是内部创建的函数。本质上,我想捕获任何插入实例,而不管插入函数位于何处。