首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::只在windows下格式化异常

boost::只在windows下格式化异常
EN

Stack Overflow用户
提问于 2016-06-17 15:11:05
回答 1查看 402关注 0票数 0

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

代码语言:javascript
复制
boost::bad_format_string: format-string is ill-formed

我使用宏来定义不同平台的十六进制输出格式:

代码语言:javascript
复制
#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

呼叫格式如下:

代码语言:javascript
复制
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‘格式,作为一个十六进制,但您知道写同一行的方式,它将工作的所有平台?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-17 19:14:07

I64X不是boost::format的有效格式规范(它是特定于微软的)。格式规范类型不是特定于平台的.Boost不使用您的实现运行时提供的[sf]printf例程,这就是为什么它与Visual的fprintf一起工作并不真正影响boost::format支持的原因。您应该使用%lX%llX,就像非Windows子句所做的那样。

我可能只是使用%llX everywhere并将输出变量转换为long long,例如:

代码语言:javascript
复制
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的任何地方工作,您可以添加静态断言(如图所示)以确保这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37884954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档