仅限windows下的boost :: format异常

时间:2016-06-17 15:11:05

标签: c++ visual-studio boost g++ boost-format

我在很多情况下已经使用过boost :: format但是我发现一个windows实现没有按照我的预期做出反应,因为它会抛出异常

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

我使用宏来为不同平台定义hexa数字输出格式:

#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'格式为hexa,但是你知道以一种适用于所有平台的方式编写同一行吗?

1 个答案:

答案 0 :(得分:1)

I64X不是boost::format的有效格式规范(它是特定于Microsoft的)。格式规范类型不是特定于平台的。 Boost不使用您的实现的运行时提供的[sf]printf例程,这就是为什么它与Visual Studio的fprintf一起使用并不会影响boost::format {1}}支持。您应该使用%lX%llX,因为您的非Windows子句正在执行。

我可能只是在任何地方使用%llX并将输出变量转换为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的任何地方,并且您可以添加静态断言(如图所示)以确保这一点。