0

スタティック ライブラリを作成する場合、typedef 構造によって名前の競合が発生する可能性はありますか?

以下のヘッダー ファイルの例を考えると、それmyFun()は外部シンボルになり、関数を含む他のライブラリと競合する可能性があることを理解していmyFun()ます。これを回避するにはmyFun()、より長く具体的な名前を付けることをお勧めします。

// myFile.h

typedef struct
{
    int myVar;
} myStruct;

void myFun(myStruct * input);

myStruct外部シンボルは、別のライブラリとリンクするときに名前の衝突を引き起こす可能性がありますか?

.aまた、スタティック ライブラリ ファイルをで見ると、リストに表示されないのはなぜnm myLib.aですか?

4

1 に答える 1

2

いいえ、名前はリンケージを介してライブラリ (またはソース ファイル) の外部でのみ表示されます。C では、型にはリンケージがありません。C11 §6.2.2/2:

プログラム全体を構成する翻訳単位とライブラリのセットでは、外部リンケージを持つ特定の識別子の各宣言は、同じオブジェクトまたは関数を示します。

異なる翻訳単位の2 つのstruct定義 (通常は共通のヘッダーの組み込みによる) は、相互の互換性を実現するためにある程度の類似性まで一致する必要がありますが、概念的には、各翻訳単位には独自のデータ型のセットがあります。

typedefC++ では、クラス型、およびクラス型と共に宣言された名前にはリンケージがあるため、理論的には懸念の原因があります。ただし、実際には、リンカーはそれらを認識しません。

だから、心配することは本当に何もありません。

于 2014-02-18T03:16:02.613 に答える