2016-06-17 6 views
0

ich bereits boost :: Format in vielen Fällen verwendet, aber ich fand eine, für die die Umsetzung Fenster nicht reagiert, wie ich erwartet hatte, weil es eine Ausnahmeboost :: Format Ausnahme unter Windows nur

boost::bad_format_string: format-string is ill-formed 

Ich werfe verwenden Makro hexa Anzahl Ausgabeformat für andere Plattform zu definieren:

#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 

und Aufrufformat wie unten:

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(); 

Bemerkung, dass ich eine Syntax verwende, die perfekt mit einem "fprintf" funktioniert.

Ich nehme an, dass es aus dem 'Uint64_t' Format als Hexa kommt, aber wissen Sie, die gleiche Zeile in einer Weise zu schreiben, die es für alle Plattform funktioniert?

Antwort

1

I64X ist keine gültige Formatspezifikation für boost::format (es ist Microsoft-spezifisch). Die Formatspezifikationstypen sind nicht plattformspezifisch. Boost verwendet nicht die Routinen [sf]printf, die von der Laufzeit Ihrer Implementierung bereitgestellt werden, weshalb die Tatsache, dass es mit Visual Studio fprintf arbeitet, nicht wirklich Auswirkungen auf das hat, was boost::format unterstützt. Sie sollten entweder %lX oder %llX verwenden, wie es Ihre Nicht-Windows-Klausel tut.

würde ich wahrscheinlich verwenden nur %llX überall und Ausgangsgrößen zu long long werfen, zum Beispiel:

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(); 

Dies sollte überall arbeiten, dass unsigned long long ausreichend ist uint64_t darzustellen, und Sie können eine statische Behauptung hinzufügen (wie dargestellt) um sicherzustellen, dass.

Verwandte Themen