関数のプロトタイプが見つからない場合、コンパイラ エラーが発生することを理解しています。しかし、ライブラリに公開されていない関数が含まれていることを知っていて、そのための独自のプロトタイプを作成したとしましょう (静的ライブラリ内のものと一致します)。リンカーはこれを取り込むことができますか?
私が尋ねている理由は、「init()」のような内部使用のみの関数に一般的な総称名を使用しているライブラリを作成しているためです。リンク中にライブラリ外のシンボルと衝突するかどうか疑問に思っています
関数のプロトタイプが見つからない場合、コンパイラ エラーが発生することを理解しています。しかし、ライブラリに公開されていない関数が含まれていることを知っていて、そのための独自のプロトタイプを作成したとしましょう (静的ライブラリ内のものと一致します)。リンカーはこれを取り込むことができますか?
私が尋ねている理由は、「init()」のような内部使用のみの関数に一般的な総称名を使用しているライブラリを作成しているためです。リンク中にライブラリ外のシンボルと衝突するかどうか疑問に思っています
それは関数のリンケージに依存します:
//.c file
// external linkage, accessible from outside using the right prototype
void foo(void) {}
// internal linkage, not accessible from outside
static void bar(void) {}
問題の解決策は、ライブラリに何らかのプレフィックスを定義することです。たとえばouah_
、作成できない限り、すべての関数/変数名にプレフィックスを付けますstatic
(つまり、それらが定義されているファイルでのみ表示されます)。いいえ、名前の衝突がないことを保証するわけではありませんが、衝突が大幅に減少するはずです。Doug Gwin のQ8の背後にある理由のように...
このところnamespace
で、C ++の背後にある理由であり、OOPとその「クラス」に属する「メソッド」/「メンバー関数」のせいでもあります
プロトタイプは、リンカーではなく、コンパイラの利益のためのものです。コンパイラは、宣言した関数のコードを問題なくコンパイルしますが、別のファイルまたはライブラリで静的として定義されている関数を使用しようとすると、リンカー エラーが発生します。
ファイルの外部で使用しない場合は、独自の関数を static として宣言できますし、宣言する必要があります。しかし、同じ関数名を持つ宣言を含む他のコードでコンパイルすると、それらがすべて同じように定義されていない限り、競合が発生します。たとえば、init
関数を静的として定義した場合、その関数はそのファイルでのみ直接使用できます。しかし、別の関数を別の名前で宣言したヘッダー ファイルをインクルードするとinit
、エラーが発生します。
(別のファイルの静的関数にアクセスすることは可能ですが、ポインターが必要です。)