0

次の .h および .cpp ファイルがあります

必要に応じて、関数定義の完全なコードを含めます

プログラムをコンパイルすると、最後にエラーが表示されます

ハッシュ.h

    #define BUCKETS 64
       #define B_ENTRIES 50000
       int curr_tanker;
       typedef unsigned long int ulong;
typedef struct bucket
{
    int bucket_id;
    ulong bucket_entries;
}bucket;

typedef struct tanker_record
{
    ulong tanker_id;
    ulong tanker_size;
    ulong num_of_entries;
    ulong bucket_entry_count;
   }tanker_record;
typedef struct fpinfo
{ 
    unsigned long chunk_offset;
    unsigned long chunk_length;
    unsigned char fing_print[33];

}fpinfo;

struct fpinfo* InitHTable(fpinfo *);
int CreateTanker(tanker_record tr[]);
int Hash_CreateEntry(struct fpinfo *,struct fpinfo he,tanker_record tr);

ht.cpp

#include <stdlib.h>
#include <string.h>
#include<stdio.h>
#include <iostream>

#include "ht.h"

struct fpinfo* InitHTable(struct fpinfo ht[][B_ENTRIES])
{
}
int CreateTanker(tanker_record tr[])
{
}
int
Hash_CreateEntry(struct fpinfo *t[][B_ENTRIES],struct fpinfo he,tanker_record tr[])
{
}
static void
WriteHTtoFile(struct fpinfo *t[][B_ENTRIES],int this_tanker)
{
}

main.cpp

#include<iostream>
#include"ht.cpp"
#include<conio.h>
#include<stdlib.h>

void main(int argc, char **argv)
{
static fpinfo hash_table[BUCKETS][B_ENTRIES];
static tanker_record tr[100];
InitHTable(&hash_table[0][0]);
CreateTanker(tr);
struct fpinfo fp;
... 
ar = Hash_CreateEntry(&hash_table[0][0], fp,tr[0]);

vc2010 を使用してコンパイルしようとすると、次のエラーが発生します。

1>main.obj : エラー LNK2005: "struct fpinfo * __cdecl InitHTable(struct fpinfo (* const)[50000])" (?InitHTable@@YAPAUfpinfo@@QAY0MDFA@U1@@Z) ht.obj で既に定義されています

1>main.obj : エラー LNK2005: "int __cdecl CreateTanker(struct tanker_record * const)" (?CreateTanker@@YAHQAUtanker_record@@@Z) は ht.obj で既に定義されています

1>main.obj : エラー LNK2005: "int __cdecl Hash_CreateEntry(struct fpinfo * (* const)[50000],struct fpinfo,struct tanker_record * const)" (?Hash_CreateEntry@@YAHQAY0MDFA@PAUfpinfo@@U1@QAUtanker_record@@@ Z) ht.obj で既に定義されています 1>main.obj : エラー LNK2005: "int curr_tanker" (?curr_tanker@@3HA) ht.obj で既に定義されています 1>main.obj : エラー LNK2019: 未解決の外部シンボル "int __cdecl Hash_CreateEntry (struct fpinfo *,struct fpinfo,struct tanker_record)" (?Hash_CreateEntry@@YAHPAUfpinfo@@U1@Utanker_record@@@Z) 関数 _main 1>main.obj で参照: エラー LNK2019: 未解決の外部シンボル "struct fpinfo * __cdecl InitHTable (struct fpinfo *)" (?InitHTable@@YAPAUfpinfo@@PAU1@@Z) 関数 _main で参照

ご協力いただきありがとうございます!!

4

2 に答える 2

1

ヘッダーに「インクルード ガード」を追加して、前処理後に内容が 2 回「表示」されないようにします。Microsoftの場合#pragma once、.h ファイルの先頭。一般に、次を追加します。

#ifndef __YOUR_HEADER_H
#define __YOUR_HEADER_H
// all the stuff from the header here
#endif

各ヘッダーに一貫した「一意の」命名スキームを採用してください。__YOUR_HEADER_Hたとえば、customio.hにし__CUSTOM_IO_Hます。

于 2012-02-27T12:51:32.503 に答える
1

ht.cppfromを含めています。これには、それ自体main.cppで既に定義されている関数のすべての定義が含まれht.cppます。

ht.h代わりに含めたい。

この状況では役に立ちませんが、ヘッダー ファイルをインクルード ガードで保護する必要もあります。

#ifndef HT_H
#define HT_H

// contents of ht.h

#endif

また、関数宣言の引数が定義の引数と一致する必要があります。

struct fpinfo* InitHTable(struct fpinfo[][B_ENTRIES]);
// Missing:                              ^^^^^^^^^^^

int CreateTanker(tanker_record tr[]); // OK

int Hash_CreateEntry(struct fpinfo*[][B_ENTRIES],struct fpinfo,tanker_record[]);
// Missing                         ^^^^^^^^^^^^^                            ^^
于 2012-02-27T12:52:43.000 に答える