3

ヘッダー ファイルにインクルード ガードを配置しても、常に次のエラーが発生します。

duplicate symbol _Bittorrent in:
    /Users/tracking/Library/Developer/Xcode/DerivedData/SHT-giuwkwyqonghabcqbvbwpucmavvg/Build/Intermediates/SHT.build/Debug/SHT.build/Objects-normal/x86_64/main.o
    /Users/tracking/Library/Developer/Xcode/DerivedData/SHT-giuwkwyqonghabcqbvbwpucmavvg/Build/Intermediates/SHT.build/Debug/SHT.build/Objects-normal/x86_64/Handshake.o
duplicate symbol _eight_byte in:
    /Users/tracking/Library/Developer/Xcode/DerivedData/SHT-giuwkwyqonghabcqbvbwpucmavvg/Build/Intermediates/SHT.build/Debug/SHT.build/Objects-normal/x86_64/main.o
    /Users/tracking/Library/Developer/Xcode/DerivedData/SHT-giuwkwyqonghabcqbvbwpucmavvg/Build/Intermediates/SHT.build/Debug/SHT.build/Objects-normal/x86_64/Handshake.o
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

.h ヘッダー ファイル、.c ファイル、および main.c は次のとおりです。

main.c

#include "Handshake.h"
int main(int argc, char** argv)
{
    // some code.
    return 0;
}

Handshake.h

#ifndef SHT_Handshake_h
#define SHT_Handshake_h

const char    *Bittorrent     =   "BitTorrent protocol";
const char    eight_byte[8]   =   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

#endif

Handshake.c

#include "Handshake.h"


int Send_fisrt_Handshake(download_connection *pPeer, Handshake *necessary_info)
{
    //some statements
    return 1;
}

void Set_Handshake_information(TorrentFile* pArg, Handshake *pYours)
{

    //some statements

}

しかし、ヘッダー ファイルからグローバル変数を削除すると、これらのコードは正常にコンパイルされます。
理由がわかりません。誰かが理由を説明できますか?前もって感謝します。

4

5 に答える 5

4

ヘッダー ファイルで変数を定義するためです。次に、ヘッダー ファイルを含むすべてのソース ファイルに、これらの変数が定義されます。

次のキーワードを使用して、変数を宣言できます。extern

extern const char    *Bittorrent;
extern const char    eight_byte[8];

次に、1 つのソース ファイルで変数を定義します。

または、変数を のように定義してstatic、スコープを翻訳単位 (つまり、ソース ファイル) に限定することもできます。

static const char    *Bittorrent     =   "BitTorrent protocol";
static const char    eight_byte[8]   =   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

constこれは、も意味するC++ とは異なりstaticます。

于 2013-07-11T12:19:50.027 に答える
1

また、タイプミスがあることにも注意してください。

Send_fisrt_Handshakeの代わりにSend_first_Handshake

質問に間違って入力しただけだと想像できます。しかし、あなたは決して知りません。タイプミスは、大規模なコードでは見つけて修正するのが難しい場合があります。:)

于 2013-07-11T13:57:36.143 に答える
1

変数を初期化することにより、ファイルが含まれるすべての場所で変数を定義します。これらのモジュールが互いにリンクされていると仮定すると、複数の定義が存在することになりますが、これはエラーです。

extern タグを使用してヘッダーで変数を宣言し、.c モジュールの 1 つで初期化できます

.h ファイル内:

extern int i;

.c ファイルの 1 つで:

int i = 1;

でも、

于 2013-07-11T12:21:23.307 に答える
1

ヘッダ:

extern const char    *Bittorrent;

Main (メイン関数の前 / グローバル変数として):

const char    *Bittorrent     =   "BitTorrent protocol";

このようにして、ヘッダーはすべてのファイルに「Bittorrent」という名前の変数があることを伝えますが、実際に作成される部分があるのは main.c ファイルだけです。

于 2013-07-11T12:19:27.817 に答える