2012-02-27 6 views
0

I가 다음 .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 : "를 구조체 fpinfo * InitHTable __cdecl (구조체 ht.obj에 이미 정의 된 (InitHTable @@ YAPAUfpinfo @@ QAY0MDFA @ U1 @@ Z)

1> main.obj : 오류 LNK2005 : "int __cdecl CreateTanker (struct tanker_record * const) " (? CreateTanker @@ YAHQAUtanker_rec (int const @@@ Z) 이미 정의 된 ht.obj

1 main.obj : 오류 __cdecl Hash_CreateEntry (struct fpinfo * (* const) [50000], struct fpinfo, tanker_record * const 구조체) ht.obj에 이미 정의되어있는? Hash_CreateEntry @@ YAHQAY0MDFA @ PAUfpinfo @@ U1 @ QAUtanker_record @@@ Z) > main.obj : 오류 LNK2005 : "int curr_tanker"(? curr_tanker @@ 3HA)는 ht.obj에 이미 정의되어 있습니다. obj 1> main.obj : 오류 LNK2019 : 해결되지 않은 외부 기호 "int __cdecl Hash_CreateEntry (struct fpinfo *, struct fpinfo, tanker_record 구조체)"function에서 참조 된 (? Hash_CreateEntry @@ YAHPAUfpinfo @@ U1 @ Utanker_record @@@ Z) _main 1> main.obj : 오류 LNK2019 : 해결되지 않은 외부 기호 "_fInstruction _fdcl InitHTable (struct fpinfo *)"(InitHTable @@ YAPAUfpinfo @@ PAU1 @@ Z) 주

도움 주시면 감사하겠습니다.

답변

1

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

내가 원래 한 일이지만 여전히 마지막 세 가지 오류가 있습니다. 처음 두 개의 "lnk2005"오류 만 피할 수 있습니다. – John

+0

@ 존 : 오, 그렇습니다. 오류를 읽으면서 내 눈이 윤이 난 것 같습니다. 이는 선언이 정의와 일치하지 않기 때문입니다. 선언에는 포인터에서 객체로의 인수가 있고 정의에는 포인터에서 배열로의 인수가 있습니다. –

+0

감사합니다. 그러나 함수 호출에 적합한 구문은 무엇입니까? 첫 번째 오류가 발생합니다 ** 오류 C2664 : 'InitHTable': 매개 변수 1을 'fpinfo *'에서 'fpinfo * [] [50000]'**로 변환 할 수 없습니다. ** 오류 C2664 : 'Hash_CreateEntry': 매개 변수 1을 'fpinfo *'를 'fpinfo * [] [50000]'** – John

1

헤더에 "포함 가드"를 추가하여 사전 처리 후 내용이 두 번 보이지 않도록하십시오. Microsoft의 경우 .h 파일의 시작 부분에 #pragma once. 일반적으로 다음을 추가하십시오 :

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

각 헤더에 일관된 "고유"이름 지정 체계를 적용하십시오. __YOUR_HEADER_H은 예를 들어 customio.h__CUSTOM_IO_H으로 변경합니다.

+1

좋은 생각이지만, [this happens] (http://stackoverflow.com/questions/3345159)의 경우 [예약 된 이름] (http://stackoverflow.com/questions/228783)을 사용하면 안됩니다.). –

+0

내가 말했듯이 ** 오류 C2337이 발생했습니다 : 'variable_name': 속성을 찾을 수 없습니다. ** ht.cpp에 사용 된 모든 변수에 대해 – John

+1

헤더에 저장소를 정의했기 때문에 해당 변수가 발견되었습니다. 헤더는 선언을위한 것이어야하며 상수에 대해서만 사용해야합니다. 항상 저장소를 선언하십시오 - 헤더에''extern int curr_tanker;''를 넣고 "implementation".cpp 파일에 적절한 "int curr_tanker;"를 넣으십시오. – foxx1337