在很多情况下,我已经使用了boost::format,但是我发现了一个窗口实现没有像我预期的那样作出反应,因为它会引发异常。
boost::bad_format_string: format-string is ill-formed我使用宏来定义不同平台的十六进制输出格式:
#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‘格式,作为一个十六进制,但您知道写同一行的方式,它将工作的所有平台?
发布于 2016-06-17 19:14:07
I64X不是boost::format的有效格式规范(它是特定于微软的)。格式规范类型不是特定于平台的.Boost不使用您的实现运行时提供的[sf]printf例程,这就是为什么它与Visual的fprintf一起工作并不真正影响boost::format支持的原因。您应该使用%lX或%llX,就像非Windows子句所做的那样。
我可能只是使用%llX everywhere并将输出变量转换为long long,例如:
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 long足以表示uint64_t的任何地方工作,您可以添加静态断言(如图所示)以确保这一点。
https://stackoverflow.com/questions/37884954
复制相似问题