2009-11-02 6 views
0

, 내가 같은 전역 변수 선언 오전 .H 파일 : 나는 컴파일 할 때, 나는 "얻을 내가 여러 CPP 파일에서이 파일을 포함하는 경우에는멀티를 포함한 .H 파일에서

#pragma data_seg(".shared") 
#ifndef DEF_VARX 
#define DEF_VARX 
int VARX=0; 
#endif /*DEF_VARX*/ 
#pragma data_seg() 
#pragma comment(linker, "/SECTION:.shared,RWS") 

을 오류 LNK2005 : "int VARX"(? VARX @@ 3HA) Dll.obj에 이미 정의 됨 "오류가 발생했습니다. 하나의 cpp 파일에만 포함 시키면. 제 점이 _ 생하지 않습니다.

아니요 #IFNDEF ....이 문제를 방지하기에 충분합니까? 내가 뭔가를 놓치고 있니?

// in a header file 
#pragma once 
extern int VARX; 

// in a .cpp 
#pragma data_seg(".shared") 
int VARX=0; 
#pragma data_seg() 
#pragma comment(linker, "/SECTION:.shared,RWS") 
+1

이 문제를 방지하기에는 충분하지 않습니다. #include를 사용하면 파일의 전체 내용을 자신의 것으로 복사하는 것과 같습니다.이것을 각각의 cpp 파일에 복사하면 각각에 "int VARX = 0;"을 포함하도록 알려줍니다. 왜냐하면 DEF_VARX는 각 파일에서 처음으로 정의되지 않기 때문입니다. 그래서 각각은 VARX의 정의를 포함 할 것입니다. #ifndefs가 int VARX를 방지합니다. 동일한 파일에서 두 번 정의되는 것을 막을 수 있습니다. – pbos

답변

2

나는 당신이 뭔가를 .H에서 변수를 선언 전달하고 나중에 통화 당에서의 공유 섹션에 정의되어 있다고 생각 주어진 번역 단위에 대한 파일의 다중 포함. (주어진 cpp 파일에 대해)

그러나 cpp 중 몇 개가이 VARX.H를 포함하면이 변수에 대한 정의가 두 개 이상 있습니다.

대신 변수를 .H 파일에 선언해야하지만 한 위치에서만 0으로 초기화해야합니다.

1

문제는 즉 당신이 방지한다는 것입니다 :

1

예, extern 키워드가 누락되었습니다.

헤더 파일에 다음을 사용하십시오.

extern int VARX; 소스 파일에서

실제로 가변 공간 선언

INT VARX = 0;

0

ifdef는 개체 파일을 차단합니다. 헤더가 여러 원본 (cpp) 파일에 포함되어 있으면 VARX는 모두에서 제외됩니다. 헤더 파일에서 extern으로 선언하고 하나의 cpp 파일로 초기화하십시오.

0

문제는 파일을 여러 컴파일 단위로 포함해야한다는 것입니다. a.cpp와 b.cpp가 있다고 가정 해 봅시다. 둘 다 헤더 파일을 포함합니다. 따라서 컴파일러는 별도로 컴파일 (사전 처리)하므로 두 파일 모두 DEF_VARX가 아직 정의되지 않았습니다. 오브젝트 파일을 함께 링크하기 위해 이동하면 링커는 이름 충돌이 있음을 감지합니다.

다른 사람들이 제안했듯이 해결책은 'extern'을 선언 한 다음 실제 값을 cpp 파일에 배치하여 한 번 컴파일되고 이름 충돌없이 모든 것에 연결되도록하는 것입니다.

3

이 동작의 이유는 각 .OBJ 파일에 라인

int VARX=0; 

을 컴파일하는 것이있다. Thats는 컴파일에 적합하지만 심볼을 링크 할 때 여러 번 정의됩니다. 이는 불법입니다.

헤더 파일에
extern int VARX; 

, 하나의

int VARX=0; 

사용 (단 하나의) 소스 파일이 문제를 해결합니다.

관련 문제