2016-06-17 3 views
0

창에서 형식 예외 아래와 같은 형식을부스트 :: 이미 많은 경우에 부스트 :: 형식을 사용하지만 난 그게 예외</p> <pre><code>boost::bad_format_string: format-string is ill-formed </code></pre> <p>I 던져 때문에 예상대로 창 구현이 반응하지 않는 하나를 발견에만

#if (defined(WIN32) || defined(WIN64)) 
    #define FORMATUI64X_09  "%09I64X" 
    #define FORMATUI64X_016  "%016I64X" 
#else 
    #if defined __x86_64__ 
    #define FORMATUI64X_09  "%09lX" 
    #define FORMATUI64X_016  "%016lX" 
    #else 
    #define FORMATUI64X_09  "%09llX" 
    #define FORMATUI64X_016  "%016llX" 
    #endif 
#endif 

및 문의 : 다른 플랫폼에 대한 헥사 번호 출력 형식을 정의하는 매크로 사용

string msg = (boost::format("0x"FORMATUI64X_016"(hex) \t %i \t %d \t %s \t %i\t ") % an uint64_t % an int % an uint % a char* % an uint).str(); 

'fprintf'와 완벽하게 작동하는 구문을 사용함을 주목하십시오.

헥사로 'uint64_t'형식에서 왔지만 모든 플랫폼에서 사용할 수있는 방식으로 같은 줄을 쓰는 것을 알고 있습니까?

답변

1

I64Xboost::format (Microsoft와 관련 있음)의 유효한 형식 사양이 아닙니다. 형식 스펙 유형은 플 '폼 특정 유형이 아 U니다. Boost는 구현의 런타임에서 제공되는 [sf]printf 루틴을 사용하지 않으므로 Visual Studio의 fprintf에서 작동한다는 사실은 실제로 boost::format에 영향을주지 않습니다. 비 Windows 절이 수행 중이므로 %lX 또는 %llX을 사용해야합니다.

static_assert(sizeof(unsigned long long) >= sizeof(uint64_t), "long long must be >= 64 bits"); 
auto s = (boost::format("0x%016llx") % static_cast<unsigned long long>(u64)).str(); 

unsigned long longuint64_t을 표현하기 위해 충분한 지 어디서든 일을해야하고, (그림) 정적 주장을 추가 할 수 있습니다

나는 아마 예를 들어, 사방 %llX를 사용하고 long long에 출력 변수를 던졌다 그것을 보장합니다.