考虑一下我的小型示例C库:
#include <external_library.h>
void some_function(void)
{
external_library_call();
// Do other stuff...
}
它计划使some_function()成为公共可调用的函数。然而,该库无法正常工作,因为它需要使用一个名为some_function()的函数的外部库,这个函数恰好有相同的原型。然而,GCC的链接器并不关心some_function符号有多少源头。它似乎随机选择一个,并且外部库可能会使用我的some_function()而不是它自己的函数。这很疯狂。我指的不是库不能正常工作的事实。这个库肯定不能正常工作。问题在于有两个源头来定义'some_function'符号,但是链接器对此没有任何处理。你知道,这并不太让我困扰,因为我已经习惯了GCC和C语言默认情况下的病态鲁莽行为。然而,一定有一种方法可以让链接器在出现相同符号的两个源头时警告我。我已经尝试过-Wall -Wextra -Wshadow,但是没有产生任何警告。请注意,-fvisibility=hidden在这里没有帮助,因为两个库都想要导出some_function()。我知道你可以说我不应该在没有唯一前缀的情况下进行函数调用。你是对的。这是一个错误。但我并不关心这个错误。这个错误是可以被链接器捕捉到的,所以应该被捕捉。没有理由链接器不应该捕捉到这个错误。另外,你使用的库可能会导出一些奇怪和意外的符号,而你并不一定控制别人的库导出什么。此外,在程序员停滞并着火之前,前缀只能做得如此独特。