2009-07-14 6 views
0

전 처리기 스위치에 따라 두 가지 구현이 가능한 클래스가 있습니다. 내가 처리 한 방법은 "src \ CompSwitch1 \ class.h"와 "src \ CompSwitch2 \ class.h"를 만드는 것입니다. 내 표준 포함 파일에서는 사용합니다클래스의 버전을 결정하는 전 처리기 스위치

#ifdef CompSwitch1 
     #include "CompSwitch1\class.h" 
    #elif CompSwitch2 
     #include "CompSwitch2\class.h" 
    #else 
     #error "Specify CompSwitch1 or CompSwitch2" 
    #endif 

두 버전이 필요한 대부분의 클래스에서 작동합니다. 그러나 그들 중 하나에서 링커 오류가 발생합니다 (lnk2019 : 해결되지 않은 외부 기호). 저는 MS Visual Studio 2005와 2008을 사용하고 있습니다. 둘 다에 나타납니다.

.h 파일의 맨 위에는 전 처리기 옵션에 대해 테스트합니다. 또한 간단히하기 위해 .h 파일 만 참조했지만 각 디렉터리의 .cpp 파일도 적절한 디렉터리에 있습니다.

+0

# include가 가져 오는 클래스의 구현 (적절한 * .cpp)이 컴파일되지 않기 때문에 LNK2019가 발생했을 수 있습니다. 오류 (어떤 기호, 정의 된 파일 등)에 대한 자세한 정보를 제공 할 수 있습니까? –

답변

0

정말로 #ELIF DEFINED (CompSwitch2) 여야합니다. 그렇지 않으면 "CompSwitch2"가 1의 값으로 정의되었다고 가정하고 있습니다 ...

+1

반드시 그렇지는 않습니다. 정의되지 않은 매크로는 부울 문맥에서 고려 될 때 0으로 평가됩니다. –

+2

이지만 1로 간주되는 값이없는 것으로 정의됩니다. 개인적으로 나는 항상 정의한 일을합니다 ... 나는 과거에 이상한 문제가 있었기 때문에 그렇게하지 않았습니다 / – Goz

1

하나의 클래스에 헤더 파일을 포함 시켰지만 다른 하나에 대한 오브젝트 파일을 링크 한 것처럼 들리거나 당신은 당신이 적어도 컴파일 오류가 아니라 가야 잘못된 헤더/CPP 쌍을 컴파일하는 경우

//in compswitch1.cpp 
#ifndef CompSwitch1 
# error "inconsistent header included" 
#endif 

//in compswitch2.cpp 
#ifndef CompSwitch2 
# error "inconsistent header included" 
#endif 

: 그들은 당신의 헤더에 다음과 같은 전처리 라인 (들)을 포함 후에 둘

0

시도는 CPP 구현 파일에 넣어 없습니다 링크 오류. 확인/수정하는 것이 훨씬 쉽습니다.)

또 다른 가능성은 cpp 파일이 컴파일에 전혀 포함되어 있지 않다는 것입니다.

#pragma message("Compiling " __FILE__) 

또는 CPP-컴파일 단위 관련이 만든 파일을,이 객체 경우 빌드 디렉토리에 식별하려고 : 그들은 모두 컴파일 얻을 있는지 확인하기 위해 CPP 파일 내부에 메시지 프라그를 넣습니다. 도움이

희망,
Ovanes

0

당신은 전처리 CPP 파일 (모든 포함 및 매크로가 확장되는 단계)를 사용할 수 있습니다.

VS 2008에서 솔루션 탐색기 -> 속성 -> C++ -> 전 처리기에서 파일을 마우스 오른쪽 단추로 클릭하고 "전처리 된 파일 생성"을 "행 번호 (/ P)"로 설정하십시오. 그런 다음 다시 마우스 오른쪽 버튼으로 파일을 클릭하고 "컴파일"을 선택하십시오. 확장자가 "i"인 파일) (예 : main.i)는 cpp가있는 디렉토리와 동일한 디렉토리에 만들어집니다. 파일을 열고 include 파일이 포함되어 있는지 확인하십시오.

이 방법은 하드 컴파일 문제를 해결하는 데 매우 유용합니다 (예 : 시스템 헤더 파일의 일부 매크로가 코드의 일부를 대체 함).