Вопрос

У меня есть следующие файлы .h и .cpp.

Если понадобится, я включу полные коды определений функций.

Когда я компилирую свою программу, я получаю ошибки, показанные в конце

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

я получаю следующие ошибки, когда пытаюсь скомпилировать его с помощью 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@ > 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 @@ошибка LNK2019:неразрешенный внешний символ "struct fpinfo * __cdecl InitHTable(struct fpinfo *)" (?InitHTable@@YAPAUfpinfo@@PAU1@@Z), на который ссылается функция _main

СПАСИБО ЗА ВАШУ ПОМОЩЬ!!

Это было полезно?

Решение

Вы в том числе ht.cpp от 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                         ^^^^^^^^^^^^^                            ^^

Другие советы

Добавьте в заголовок «защиту включения», чтобы его содержимое не «просматривалось» дважды после предварительной обработки.Для Майкрософт, #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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top