Pergunta

Eu tenho os seguintes arquivos .h e .cpp

Se for necessário, incluirei os códigos completos das definições das funções

Quando compilo meu programa, recebo os erros mostrados no final

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)
{
}

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

recebo os seguintes erros quando tento compilá-lo usando vc2010

1>main.obj:erro LNK2005:"struct fpinfo * __cdecl InitHTable(struct fpinfo (* const)[50000])" (?InitHTable@@YAPAUfpinfo@@QAY0MDFA@U1@@Z) já definido em ht.obj

1>main.obj:erro LNK2005:"int __cdecl createTanker (struct tanker_record * const)" (? createTanker @@ yahqautanker_record @@@ z) já definido em ht.obj

1>main.obj:erro LNK2005:"int __cdecl Hash_CreateEntry(struct fpinfo * (* const)[50000],struct fpinfo,struct tanker_record * const)" (? Hash_CreateEntry@@YAHQAY0MDFA@PAUfpinfo@@U1@QAUtanker_record@@@Z) já definido em ht.obj 1>main.obj :erro LNK2005:"int curr_tanker" (?curr_tanker@@3HA) já definido em ht.obj 1>main.obj :erro LNK2019:Símbolo externo não resolvido "int __cdecl Hash_CreateEntry(struct fpinfo *,struct fpinfo,struct tanker_record)" (? Hash_CreateEntry@@YAHPAUfpinfo@@U1@Utanker_record@@@Z) referenciado na função _main 1>main.obj :erro LNK2019:símbolo externo não resolvido "struct fpinfo * __cdecl InitHTable (struct fpinfo *)" (?InitHTable@@YAPAUfpinfo@@PAU1@@Z) referenciado na função _main

OBRIGADO PELA AJUDA!!

Foi útil?

Solução

Você está incluindo ht.cpp de main.cpp, que incluirá todas as definições de funções já definidas em ht.cpp em si.

Você deseja incluir ht.h em vez de.

Não vai ajudar nesta situação, mas você também deve proteger o arquivo de cabeçalho com protetores de inclusão:

#ifndef HT_H
#define HT_H

// contents of ht.h

#endif

Você também precisa que os argumentos das declarações de função correspondam aos das definições:

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

Outras dicas

Adicione um "include guard" em seu cabeçalho, para que seu conteúdo não seja "visto" duas vezes após o pré-processamento.Para a Microsoft, #pragma once no início do arquivo .h.Em geral, adicione:

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

Certifique-se de adotar um esquema de nomenclatura "exclusivo" consistente para cada um de seus cabeçalhos. __YOUR_HEADER_H faria, por exemplo customio.h em __CUSTOM_IO_H.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top