将标志整数转换为人类可读的字符串

时间:2012-06-18 23:59:37

标签: c++ winapi flags

在Win32中,有很多地方使用DWORD值指定标志值,这些值是通过执行#defined常量的按位OR来实现的。

然而,当涉及到运行程序并对其进行调试时,将生成的标志值拆分回#define符号会很麻烦(这就是我喜欢枚举类型的原因)。

如果没有重新实现Win32的函数和结构以使用枚举而不是常量,是否有一种简单而轻松的方法可以自动将整数标志值转换回其组件的字符串表示形式?例如将192转换为“FLAG_FOO | FLAG_BAR”(其中FLAG_FOO为128,FLAG_BAR为64)。

2 个答案:

答案 0 :(得分:0)

您必须手动编码字符串。

 if (myValue & FLAG_FOO == FLAG_FOO) {
   printf("FLAG_FOO");
 }
 if (myValue & FLAG_BAR == FLAG_BAR) {
   printf("FLAB_BAR");
 }

更重要的是,#define符号不是由编译器处理,而是由预处理器处理。这意味着预处理器获取定义列表并用其定义的值替换每个符号。编译器甚至没有原始符号的信息。

如果不是定义它是变量,而且程序是用调试信息编译的,那么也许你可以使用调试信息来检索数据。即使在这种情况下,它可能比一堆if更麻烦。

答案 1 :(得分:0)

这是一个非常有用的网站,我使用github和Trinket将它们放在一起:

https://earonesty.github.io/decompose_hex.html

给出一个输入数字,它将把该数字分解为一组十六进制标志。我发现它很有用(只需花几分钟的时间,但我会一遍又一遍地做下去。)

给定数字7的示例,它将吐出0x1、0x2、0x4