2011-12-29 4 views
0

최근에 오류 코드 (예 : NO_ERROR, SDL_SCREEN_FLIP_ERROR 등)의 정의가 모두 포함 된 전역 헤더 파일을 만들려고했습니다. 여기에 정의 할 정수입니다.다중 정의 (LNK2005) 오류

이 두 가지를 내 .cpp 파일에 포함 시켰지만 두 번 정의하는 것으로 오류가 나타납니다.

globals.h :

#pragma once 

// error related globals 
int SCREEN_LOAD_ERROR = 1; 
int NO_ERROR = 0; 

MAIN.CPP :

#include "globals.h" 
#include "cTile.h" 
/* rest of the code */ 

cTile.h :

#pragma once 
#include "globals.h" 

class cTile { 
}; 

SCREEN_LOAD_ERROR 및 NO_ERROR 두번 정의 불평하지만 그대로 #pragma 한 번이 (나는 또한 #ifndef 시도했지만이 또한 작동하지 않았다) 방지해야합니다.

컴파일러 출력 :

1> main.obj : 오류 LNK2005 "INT의 SCREEN_LOAD_ERROR"이미 cTile.obj에 1> main.obj 정의 (3HA @@ SCREEN_LOAD_ERROR?) : 오류 LNK2005를 "INT의 NO_ERROR "(? NO_ERROR @@ 3HA) cTile.obj에 이미 정의되어 있습니다.

누락 된 항목이 있습니까?

답변

5

헤더 파일 내에 변수를 선언하지 마십시오.
헤더 파일에 변수를 선언하면 변수의 복사본이 헤더 파일을 포함하는 각 번역 단위에서 만들어집니다.

해결 방법은 다음과 같습니다
당신의 헤더 파일 중 하나 내부 그들에게 extern를 선언하고 CPP 파일의 정확히 하나를 정의합니다.

globals.h :

extern int SCREEN_LOAD_ERROR; 
extern int NO_ERROR; 

globals.cpp :

#include "globals.h" 
int SCREEN_LOAD_ERROR = 0; 
int NO_ERROR = 0; 

MAIN.CPP :

#include "globals.h" 

cTile.h : 당신은 단순히 열거를 사용할 수

#include "globals.h" 
+0

건배, 즉 문제가 있었다. 나는 이것을 할 수 없다는 것을 몰랐다. – Zilarion

3

:

globals.h :

enum 
{ 
    SCREEN_LOAD_ERROR = 1, 
    NO_ERROR = 0, 
    // ... 
} 
+1

그래,이 방법을 제대로 수행하는 것처럼 보입니다. –

0

#ifndef 잘 작동 사용 (작동하지만, 이것이 가장 좋은 방법이 아닙니다.). 다음과 같이 시도하십시오 :

전역.시간

#ifndef GLOBALS 
#define GLOBALS 

int SCREEN_LOAD_ERROR = 1; 
int NO_ERROR = 0; 

#endif 

cTile.h :

#include "globals.h" 

class cTile { 
}; 

MAIN.CPP :

#include "globals.h" 
#include "cTile.h" 
/* rest of the code */ 
+0

잘못되었습니다. 포함 경비원은 번역 단위당 영구적입니다. 다른 cpp가 헤더를 포함하면 변수를 재정의합니다. 선언은 헤더에 남아 있어야하며 정의는 단일 구현 파일로 이동되어야합니다. –