2010-04-25 13 views
5

부스트의 C99 stdint 구현은 매우 편리합니다. 한가지는 나를 괴롭힌다. 그들은 모든 typedef를 boost namespace에 버립니다. 이 기능 사용할 때 세 가지 선택 사항으로 나를 잎 :부스트의 "cstdint"사용법

  1. 사용 "using namespace boost"
  2. 사용 "using boost::[u]<type><width>_t"
  3. 명시 적으로 boost:: 접두어 대상 유형을 참조; 예컨대,

  • boost::uint32_t foo = 0; 옵션 패배 № 1 종류의 스페이스 포인트. 로컬 범위 내에서 (예 : 함수 내에서) 사용되는 경우에도 함수 인수와 같은 옵션은 옵션 № 3과 같이 접두사를 사용해야합니다.
  • 옵션 № 2가 더 좋지만 이러한 유형이 많기 때문에 시끄러운.
  • 옵션 № 3은 극한의 잡음을 추가합니다. boost:: 접두어는 종종 해당 유형의 길이보다 ≥입니다.

내 질문은 : 무엇 전역 네임 스페이스에 이러한 유형을 모두 가져 오는 가장 우아한 방법이 될 것이다? 방금 옵션 № 2를 사용하는 boost/cstdint.hpp 주위에 래퍼를 작성하고 완료해야합니까?


또한, 그래서 VC++ 10 (표준 라이브러리 헤더 문제)에 작동하지 않았다 같은 헤더를 포장 :

namespace Foo 
{ 
    #include <boost/cstdint.hpp> 

    namespace boost_alias = boost; 
} 

using namespace Foo::boost_alias; 

편집 : 나는 다른 옵션은 전처리를 사용하는 것입니다 생각 VC 10에서 작동하도록하려면? 위의 스 니펫을 취하는 방법 :

#ifndef FOO_HPP_INCLUDED 
#define FOO_HPP_INCLUDED 

#if _MSC_VER >= 1600 /*VC++ 10*/ || defined USE_NATIVE_STDINT_HEADER 
    #include <stdint.h> 
#else 
    namespace cstdint_wrapper 
    { 
    #include <boost/cstdint.hpp> 

    namespace boost_alias = boost; 
    } 

    using namespace cstdint_wrapper::boost_alias; 
#endif 

#endif 

적은 작업일까요?

+0

가능한 복제본 : http://stackoverflow.com/questions/1481733/portable-c-03-exact-width-types –

+0

@gf : nifty script, thanks. – patt0h

+0

왜이 모든 유형의 * all *이 필요합니까? 나는 종종 그 중 한두 가지를 사용하지만, 나는 그들 모두를 필요로 함을 기억하지 못합니다. – jalf

답변

5

방금 ​​C99의 stdint.h을 사용합니다 (실제로 VS 2010에 있음).

  • http://snipplr.com/view/18199/stdinth/
  • : 그것을 포함하지 않는 비주얼 C/C++의 버전, 나는 (내가 VC6에서 일했을 때부터) VC6에서 작동하도록 수정는 MinGW에서 공개 버전을 사용

이 SO 질문을 고려해 볼 수 있습니다 몇 가지 다른 옵션이 있습니다 : 당신이 boost/cstdint.hpp을 계속 사용하려는 경우 C99 stdint.h header and MS Visual Studio

, 내가 말하고 싶지만 그로 유형을 제공 래퍼 헤더를 구현하는 제안 전역 네임 스페이스가 갈 길이 될 것입니다.

boost/cstdint.hpp은 내가 알아야 할 모든 것을 제공합니까? ?

+0

Re : cstdint.hpp vs stdint.h - 차이점은 cstdint.hpp는 64 비트 유형과 관련 매크로가 포함되어 있지 않을 수도 있다는 것입니다. 왜냐하면 long long은 아직 표준이 아니기 때문입니다. 그 외에도, 나는 이미 프로젝트에 여러 가지 종속성이 있기 때문에 boost 버전을 사용하고 싶었다. 이 경우 추가 헤더를 배포하는 것이 타당하지 않습니다. – patt0h

1

개인적으로 항상 옵션 3을 사용합니다. 일이 너무 길면 typedef를 사용하여 코드 양을 줄일 수 있습니다.

2

옵션 2를 구현하는 래퍼 헤더를 작성하는 아이디어는 분명히 세 가지 옵션 중 더 좋습니다.

내가 제안하는 것은 약간의 변형입니다. cstdint 또는 그와 같은 다른 네임 스페이스 내에 해당하는 using 선언을 넣으십시오. 그런 다음 using cstdint;을 자신의 코드에 넣거나 특정 용도로 cstdint::을 명시 적으로 지정하면 옵션을 사용할 수 있습니다.

2

파일을 직접 포함시킨 경우 std ::로 접두사를 붙이십시오. 그래서 문제는이 경우 어떤 옵션을 택할 것인가입니다. Boost가 소개 한 다른 유형으로 무엇을 할 것입니까? 부스트로 접두어를 붙이시겠습니까 :: 아닌가요?

주먹 하나는 분명히 나쁜 옵션입니다. 당신은 당신의 my_cstdint.hpp 파일

#include <boost/cstdint.hpp> 

using boost::uint32_t; 
... 

를 사용하여 두 번째 옵션을 구현하고 응용 프로그램에서 my_cstdint.hpp를 포함 할 수 있습니다. 그러나 내 생각에 루트 네임 스페이스에 새로운 기호를 추가하는 것은 좋지 않습니다. 유형이 이미 stdint.h C 파일과 같이 정의 될 수 있으므로 충돌이 더 많이 발생할 수 있습니다.

세 번째 옵션이 많은 문자를 사용하더라도 네임 스페이스가이 용도로 사용됩니다. boost :: uint32_t는 툴셋에 따라 올바른 유형으로 정의되므로 std :: uint32_t와 마찬가지로 사용하십시오.

+0

하지만이 작업을 수행하고 루트 대신 프로젝트 네임 스페이스에 using 선언문을 추가 할 수 있습니다. (모두 프로젝트 별 네임 스페이스를 사용하고 있습니다. 그렇지 않은 경우 어쨌든 루트 네임 스페이스를 오염시키지 않아도됩니다.) –