errori esterni irrisolti
-
13-11-2019 - |
Domanda
Ho i seguenti file .h e .cpp
Se devo includerò i codici completi delle definizioni della funzione
Quando compilo il mio programma ottengo gli errori mostrati alla fine
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]);
.
Ottengo i seguenti errori quando provo a compilarlo usando VC2010
.1> Main.obj: Errore LNK2005: "Struct FPInfo * __CDECL INITHTABLE (Struct FPInfo (* Const) [50000])" (? Inithtable @@ yapaufpinfo @@ qay0mdfa @ @@ z) già definito in HT. OBJ
1> Main.obj: Errore LNK2005: "INT __CDECL Createtanker (Struct Tanker_record * Const)" (? Createtanker @@ yahqautanker_record @@@ z) già definito in ht.obj
1> Main.obj: errore LNK2005: "int __cdecl hash_createentry (struct fpinfo * (* const) [50000], struct fpinfo, cisterna strutturale_record * const)" (? hash_createentry @@ yahqay0mdfa @ paufpinfo @@ u1 @ qautanker_record @@@ z) già definito in ht.obj 1> Main.obj: errore LNK2005: "int curr_tanker" (? Curr_tanker @@ 3ha) già definito in ht.obj 1> Main.obj: Errore LNK2019: simbolo esterno irrisolto "int __cdecl hash_createentry (struct fpinfo *, struttura fpinfo, cisterna strutturale_record)" (? Hash_Createentry @@ yahpaufpinfo @@ u1 @ utanker_record @@@@ z) Riferito in funzione _main 1> Main.obj: Errore LNK2019: simbolo esterno irrisolto "Struct FPInfo * __CDECL INITHTABLE (Struct FPInfo *)" (? INTHTABLE @@ Yapaufpinfo @@ pau1 @@ z) Riferito in funzione _main
Grazie per il tuo aiuto !!
Soluzione
Sei incluso ht.cpp
da main.cpp
, che includerà tutte le definizioni di funzioni già definite in ht.cpp
stesso.
Volete includere invece ht.h
.
Non aiuterà in questa situazione, ma dovresti anche proteggere il file di intestazione con le protezioni includono:
#ifndef HT_H
#define HT_H
// contents of ht.h
#endif
.
Hai inoltre bisogno degli argomenti delle dichiarazioni della funzione per adattarsi a quelle delle definizioni:
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 ^^^^^^^^^^^^^ ^^
. Altri suggerimenti
Aggiungi una "Includi Guard" nel tuo intestazione, in modo che i suoi contenuti non siano "visti" due volte dopo la pre-elaborazione.Per Microsoft, #pragma once
all'inizio del file .h.In generale, aggiungi:
#ifndef __YOUR_HEADER_H
#define __YOUR_HEADER_H
// all the stuff from the header here
#endif
.
Assicurati di adottare uno schema di denominazione "unico" coerente per ciascuna delle tue intestazioni.__YOUR_HEADER_H
farebbe, ad esempio customio.h
in __CUSTOM_IO_H
.