私の小さな C ライブラリの例を考えてみましょう:
#include <external_library.h>
void some_function(void)
{
external_library_call();
// Do other stuff...
}
some_function() をパブリックに呼び出せるようにする予定です。ただし、ライブラリが必要とする外部ライブラリも、たまたま同じプロトタイプを持つ some_function() という関数を使用しているため、ライブラリは機能しません。ただし、GCC のリンカーは、some_function シンボルのソースがいくつあるかは気にしません。一見無作為に 1 つを選択し、外部ライブラリは独自の代わりに my some_function() を使用する場合と使用しない場合があります。これは非常識です。ライブラリが機能しないという事実ではありません。このライブラリは絶対に機能しないはずです。シンボル「some_function」のソースが 2 つありますが、リンカーはそれについて何もしません。そして、ご存知のように、私はGCCに慣れており、Cは一般的にデフォルトで病理学的に無謀であるため、それほど気にしません。方法があるに違いない ただし、同じシンボルに 2 つのソースがある場合にリンカに警告させるためです。-Wall -Wextra -Wshadow は既に試しましたが、警告は表示されません。
両方のライブラリが some_function() をエクスポートしたいので、-fvisibility=hidden はここでは役に立たないことに注意してください。一意のプレフィックスなしで関数呼び出しを行うことで、私を恥ずかしく思うことができます。あなたが正しい。それは間違い。私は気にしない。この間違いはリンカーによってキャッチできるため、キャッチする必要があります。リンカーがこの間違いをキャッチしない理由はありません。さらに、使用しているライブラリは奇妙な予期しないシンボルをエクスポートする可能性があり、他の誰かのライブラリがエクスポートするものを必ずしも制御できるとは限りません。それとプレフィックスは、プログラマーが停止して発火する前に、非常に一意にすることができます。