Frage

Ich habe die folgenden .h- und .cpp-Dateien

Bei Bedarf füge ich die vollständigen Codes der Funktionsdefinitionen hinzu

Wenn ich mein Programm kompiliere, werden am Ende die Fehler angezeigt

Hash.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]);

Ich erhalte die folgenden Fehlermeldungen, wenn ich versuche, es mit vc2010 zu kompilieren

1>main.obj :Fehler LNK2005:„struct fpinfo * __cdecl InitHTable(struct fpinfo (* const)[50000])“ (?InitHTable@@YAPAUfpinfo@@QAY0MDFA@U1@@Z) bereits in ht.obj definiert

1>main.obj :Fehler LNK2005:"int __cdecl createTanker (struct tanker_record * const)" (? CreateTanker @@ Yahqautanker_Record @@@ z) Bereits in ht.obj definiert

1>main.obj :Fehler LNK2005:"int __cdecl Hash_CreateEntry(struct fpinfo * (* const)[50000],struct fpinfo,struct tanker_record * const)" (?Hash_CreateEntry@@YAHQAY0MDFA@PAUfpinfo@@U1@QAUtanker_record@@@Z) already defined in ht.obj 1 > main.obj:Fehler LNK2005:"int Curr_tanker" (?Fehler LNK2019:Ungelöstes externes Symbol "int __cdecl Hash_CreateEntry (Struktur fpinfo *, struct fpinfo, struct tanker_record)" (?Fehler LNK2019:unaufgelöstes externes Symbol „struct fpinfo * __cdecl InitHTable(struct fpinfo *)“ (?InitHTable@@YAPAUfpinfo@@PAU1@@Z), referenziert in Funktion _main

VIELEN DANK FÜR IHRE HILFE!!

War es hilfreich?

Lösung

Du schließt ein ht.cpp aus main.cpp, die alle Definitionen der bereits in definierten Funktionen enthält ht.cpp selbst.

Sie möchten einbeziehen ht.h stattdessen.

In dieser Situation hilft es nicht, aber Sie sollten die Header-Datei auch mit Include-Schutzvorrichtungen schützen:

#ifndef HT_H
#define HT_H

// contents of ht.h

#endif

Außerdem müssen die Argumente der Funktionsdeklarationen mit denen der Definitionen übereinstimmen:

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                         ^^^^^^^^^^^^^                            ^^

Andere Tipps

Fügen Sie einen „include Guard“ in Ihren Header ein, damit sein Inhalt nach der Vorverarbeitung nicht zweimal „gesehen“ wird.Für Microsoft, #pragma once am Anfang der .h-Datei.Fügen Sie im Allgemeinen hinzu:

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

Stellen Sie sicher, dass Sie für jeden Ihrer Header ein einheitliches „eindeutiges“ Benennungsschema verwenden. __YOUR_HEADER_H würde zum Beispiel reichen customio.h hinein __CUSTOM_IO_H.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top