boost::format 仅在 windows 下例外
boost::format exception under windows only
我已经在很多情况下使用了 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' 六边形格式,但您知道以适用于所有平台的方式编写同一行吗?
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
的任何地方,您可以添加静态断言(如图所示)以确保这一点。
我已经在很多情况下使用了 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' 六边形格式,但您知道以适用于所有平台的方式编写同一行吗?
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
的任何地方,您可以添加静态断言(如图所示)以确保这一点。