2013-06-11 6 views
1

Windows 및 Mac 시스템 용 브라우저 플러그인 (C++)에 대해 다른 코드를 유지 관리하고 있습니다. 코드의 차이점은 공유 포인터에 대한 것입니다.
windows 버전에서는 std :: tr1 :: shared_ptr을 사용하고 있으며 Mac 버전에서는 boost :: shared_ptr을 사용하고 있습니다.boost :: shared_ptr 대 std :: tr1 :: shared_ptr on multi os 컴파일

이제이 코드를 하나로 병합하고 싶습니다. 두 코드 모두에서 std :: tr1 :: shared_ptr을 사용하고 단일 소스 코드를 유지하지만 두 개의 다른 솔루션/프로젝트 폴더를 유지하려고합니다. 이 브라우저 플러그인은 OSX 10.5 이상을 지원합니다. 현재 Xcode 4.6.2 (Apple LLVM 컴파일러)에서 컴파일 중입니다. 기본적으로 저는 Windows 프로그래머이며 Visual Studio에서 주로 작업합니다.

제 질문은 Mac 이전 버전이이 변경 사항으로 플러그인을 지원할 것입니다. 이것이 좋은 생각입니까? 이 경우 부스트가 유용한 지 여부를 알려주십시오.

답변

0

왜 테스트하지 않으시겠습니까? 쉬운 첫 번째 단계는 후드 아래에 실제 공유 포인터 정의를 변경하는 typedef을 사용하는 것입니다 :

namespace myNs{ 
    #ifdef _USE_STD_SRDPTR 
    typedef std::shared_ptr sharedPtr; 
    #else 
    typedef boost::shared_ptr sharedPtr; //default to boost if no symbol defined 
    #endif 
} 

//in code replace old shared pointer usage 
myNs::sharedPtr<Fruit> ourFruit(new Banana(WONKY)); 

이 방법은 당신이 모두 코드 라이브러리에 교체하고, 당신이 원하는 때마다 기본이되는 구현을 변경할 수 있습니다. 코드를 변경하지 않고도 필요에 따라 더 많은 옵션 (예 : tr1 버전)에 대한 지원을 추가 할 수 있습니다. 물론 모든 옵션이 동일한 인터페이스를 갖거나 코드가 컴파일되지 않아야합니다.

+0

감사합니다 ... 나는 이것을 시도 할 것입니다 –

1
우선

, boost::shared_ptrstd::tr1::shared_ptr 거의 동일하지만, 당신이 대신 C++ 11 지원을 가능하게하여 std::shared_ptr를 사용해야 할 경우 (내가 생각 VS12에 기본을, 그 소리/LLVM에서 활성화되어 있어야합니다).

shared_ptr은 포인터를 래핑하는 템플릿 클래스이므로 프로그램을 컴파일 할 때 전체 코드가 인스턴스화됩니다. 원본 클래스 구현은 번역 단위에 포함 된 헤더 파일에 있습니다 (각 별도의 파일이 작성됩니다).

마찬가지로, shared_ptr (Mac에서는 .dll이나 .so 또는 다른 것)을 사용하기위한 특정 라이브러리가 필요하지 않습니다. 따라서 프로그램이 빌드 된 시스템에서 프로그램이 실행되므로 추가 라이브러리를 실행하지 않아도됩니다.

당신은 또한 수 - 호환성 이유 - shared_ptr 주위에 자신의 래퍼를 사용

namespace my_code { 
#if defined(_STD_TR1_SHARED_PTR) 
    using std::tr1::shared_ptr; 
#elif defined(_STD_SHARED_PTR) 
    using std::shared_ptr; 
#else 
    using boost::shared_ptr; 
#endif 
} 

는 따라서 사용자가 정의한 매크로에 따라 적절한 타입으로 해결할 수 my_code::shared_ptr에 액세스 할 수 있습니다. 이것은 모든 유형에 대해 호환되는 인터페이스를 사용하는 경우에만 작동하지만이 경우에 해당합니다.

+0

@Geoffroy ... 당신은 내 대답을 당신의 끝으로 복사 했습니까? 나는 당신 앞에서 바로 대답 한 것처럼 보였습니다. 그러면 당신은 제 대답을보고 그것을 당신 자신의 것으로 완벽하게 복사했습니다. 불쌍한 형태. – Dennis

+0

@Dennis no 복사하지 않았지만 유사점이 있다는 데 동의합니다. Btw 내가'typedef' 대신'using '을 사용하고 있는데, IMO가 더 우아하다. – Geoffroy

+0

@Geoffroy - 음, 나는 확신하지 못한다. 왜 원래의 답안의 일부로 포함시키지 않았습니까? 'using'은 C++에 추가 된 멋진 기능이지만 우아하게 사용하려면 올바르게 사용되어야합니다. – Dennis

관련 문제