【问题标题】:boost::format exception under windows only仅在 windows 下 boost::format 异常
【发布时间】:2016-06-17 15:11:05
【问题描述】:

我已经在很多情况下使用了 boost::format,但是我发现了一个 Windows 实现没有像我预期的那样做出反应,因为它抛出了一个异常

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' 格式的十六进制,但你知道以适用于所有平台的方式编写同一行吗?

【问题讨论】:

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


    【解决方案1】:

    I64X 不是boost::format 的有效格式规范(它是 Microsoft 特定的)。格式规范类型不是特定于平台的。 Boost 不使用您的实现运行时提供的[sf]printf 例程,这就是为什么它与Visual Studio 的fprintf 一起工作这一事实并不会真正影响boost::format 支持的内容。您应该使用 %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 的任何地方,您可以添加一个静态断言(如图所示)来确保这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      相关资源
      最近更新 更多