2012-10-04 2 views
2

내 문제는 내가이 디버그과 같은 방법 릴리스 버전을 가질 수 있도록 내 코드를 정리하고 싶은, 그리고 내가 여러 정의를 가질 수 있다는 것입니다 다른 대상 플랫폼에 대해 동일한 메소드를 사용할 수 있습니다.다른 정의 - 처리하는 여러 대상

기본적으로 문제의 핵심은 두 가지 모두 동일합니다. 동일한 서명이 필요하지만 다른 정의가 연결되어 있어야합니다.

파일 시스템과 컴파일 및 프로덕션에 대한 코드를 정리하고 정리할 수있는 가장 좋은 방법은 무엇입니까?

감사합니다.

+2

보통 이것은 # ifdef가 관련 코드를 지키도록 처리됩니다. 이것이 코드를 완전히 읽을 수 없게하는 결과를 가져 오는 경우, '실제'(다른 이름으로 지정된) 함수를 호출 할 때마다 이러한 가드 검사 만 포함하는 래퍼 함수를 ​​항상 가질 수 있습니다. – jam

답변

1

나는 당신이 소스 수준에서가 아니라 헤더 파일 (단지 같은 인터페이스를 유지해야한다), 같은 개입하는 것이 좋습니다 :

//Foo.h 

class Foo{ 
    void methodA(); 
    void methodB(); 
}; 


//Foo.cpp 

// common method 
Foo::methodA() { } 

#ifdef _DEBUG_ 
    Foo::methodB() { } 
#elif _PLATFORM_BAR_ 
    Foo::methodB() { } 
#else 
    Foo:methodB() { } 
#endif 

대신, 당신은 모든 것이 당신을 분리 유지하려면 높은 레버에서 작동해야하며, 전처리 기는 조건부로 .cpp 파일을 조건부로 포함하기에 충분하지 않습니다. 메이크 파일 또는 무엇을 사용하든 함께 작업해야합니다.

또 다른 선택은 간단하지 않을 때 특정 플랫폼에 사라 소스 파일을 가지고있는 하나가 될 수 예 :

//Foo.h 

class Foo{ 
    void methodA(); 
    void methodB(); 
}; 

//FooCommon.cpp 

void Foo::methodA() { } 

//FooDebug.cpp 
#ifdef _DEBUG_H 
void Foo::methodB() { } 
#endif 

//FooRelease.cpp 
#ifndef _DEBUG_H_ 
void Foo::methodB() { } 
#endif 
+0

이 사소한 예를 고려해 보더라도 정말 장황하다.하지만 나는 메소드 정의를 제거하고 코드를 훨씬 더 깨끗하게 유지하기 위해 몇 가지 #include를 사용할 수 있다고 생각한다. 이것에 관해서 ? – user1717079

+0

문제점은 헤더 파일에서 정의를 표시하기 위해 포함되지만 소스 코드는 항상 컴파일러 태스크에 포함된다는 것입니다. 실제로는 컴파일러에 따라 다릅니다. 그래서 당신은 많은 .cpp 파일을 구현할 것이고 #ifdef해야 할 것이다. – Jack

2
// #define DEBUG - we're making a non debug version 


#ifdef DEBUG 

// function definition for debug 

#else 

// function definition for release 

#endif 

다른 운영 체제에서도 마찬가지입니다. 물론 C++의 엉덩이에 통증이 될 수있는 모든 것을 재 컴파일하는 문제가 있습니다.

+0

동일한 서명과 관련된 여러 정의가 동일한 소스 파일에 있다고 가정합니다. 내 소스 코드는 쉽게 읽을 수 없게되고 정말로 커질 것이다. 나는 모든 것을 나눠서 대상을 분리 할 수 ​​있기를 바란다. – user1717079

1

컴파일러가 허용하는 경우, 별도의 각 버전에 대한 소스 파일을 유지하는 시도 할 수 있습니다 하위 폴더 (예 : #include "x86_d/test.h"를) 다음 흐름을 제어하는 ​​글로벌 매크로 정의를 사용 : 동일한 파일에 두 개의 서로 다른 정의를 가질 수 있도록

#define MODE_DEBUG 

#ifdef MODE_DEBUG 
#include "x86dbg/test.h" 
#else 
#include "x86rel/test.h" 
#endif 

는 또한, 멤버 함수 정의에 대한 유사한 구조를 사용할 수 있습니다. 대부분의 컴파일러는 전역 매크로에도 자체 정의를 사용하므로 위의 #define MODE_DEBUG 대신 #ifdef _CPP_RELEASE과 같은 것을 사용하거나 컴파일러 플래그를 통해 정의 할 수도 있습니다.

관련 문제