我有以下.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&gt; main.obj:错误LNK2005:“struct fpinfo * __cdecl InitHTable(struct fpinfo(* const)[50000])”(?InitHTable @@ YAPAUfpinfo @@ QAY0MDFA @ U1 @@ Z)已在ht中定义。 OBJ
1&gt; main.obj:错误LNK2005:“int __cdecl CreateTanker(struct tanker_record * const)” (?CreateTanker @@ YAHQAUtanker_record @@@ Z)已在ht.obj中定义
1&gt; 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&gt; main.obj:错误LNK2005:已经在ht.obj中定义了“int curr_tanker”(?curr_tanker @@ 3HA) 1&gt; main.obj:错误LNK2019:未解析的外部符号“int __cdecl Hash_CreateEntry(struct fpinfo *,struct fpinfo,struct tanker_record)” (?Hash_CreateEntry @@ YAHPAUfpinfo @@ U1 @ Utanker_record @@@ Z)在函数_main中引用 1&gt; main.obj:错误LNK2019:未解析的外部符号“struct fpinfo * __cdecl InitHTable(struct fpinfo *)”(?InitHTable @@ YAPAUfpinfo @@ PAU1 @@ Z)在函数_main中引用
感谢您的帮助!!
答案 0 :(得分:1)
在标题中添加“include guard”,以便在预处理后其内容不会被“看到”两次。对于Microsoft,{。1}}位于.h文件的开头。通常,添加:
#pragma once
确保为每个标头采用一致的“唯一”命名方案。 #ifndef __YOUR_HEADER_H
#define __YOUR_HEADER_H
// all the stuff from the header here
#endif
可以__YOUR_HEADER_H
进入customio.h
。
答案 1 :(得分:1)
您在ht.cpp
中加入main.cpp
,其中包含ht.cpp
本身已定义的所有函数定义。
您想要包含ht.h
。
在这种情况下它无济于事,但您还应该使用include guard:
来保护头文件#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 ^^^^^^^^^^^^^ ^^