加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

将Objective-C枚举常量转换为字符串名称

发布时间:2020-12-14 20:04:05 所属栏目:百科 来源:网络整理
导读:以前,这是不可能的(您必须手动编写全部/创建静态数组/将所有值放入字典并将其读回…等) 但我注意到最新的Xcode的lldb(4.6,也许早期的版本)会自动将枚举常量转换为字符串. 我的问题是我们使用了很多库 – 包括Apple自己的库! – 使用恼人的公共枚举,没有提供
以前,这是不可能的(您必须手动编写全部/创建静态数组/将所有值放入字典并将其读回…等)

但我注意到最新的Xcode的lldb(4.6,也许早期的版本)会自动将枚举常量转换为字符串.

我的问题是我们使用了很多库 – 包括Apple自己的库! – 使用恼人的公共枚举,没有提供“价值到字符串”的方法.所以我最终不得不(多次,多次)做“好吧,因为图书馆作者先生没有这样做,现在我必须为他们制作静态数组……”.

我一直希望苹果能够提供一条出路 – 这最终会在这里吗?或者这只是调试器可以做的一些技巧 – 仅运行时代码无法访问它吗?

解决方法

lldb没有关于打印枚举名称的任何特殊功能.我认为你所看到的是枚举值记录在调试信息中的结果(或不是).例如,

enum myenums {a = 0,b,c};
int main ()
{
 enum myenums var = b;
 return (int) var;  // break here
}

% xcrun clang -g a.c
% xcrun lldb a.out
(lldb) br s -p break
Breakpoint 1: where = a.out`main + 18 at a.c:5,address = 0x0000000100000f92
(lldb) r
[...]
-> 5     return (int) var;  // break here
   6    }
(lldb) p var
(myenums) $0 = b
(lldb) p (myenums) 0
(myenums) $1 = a
(lldb)

如果你查看这个二进制文件的调试信息(dwarfdump a.out.dSYM),你会看到变量var的类型是myenums,调试信息包括那些枚举类型的值:

0x0000005a:     TAG_enumeration_type [5] *
                 AT_name( "myenums" )
                 AT_byte_size( 0x04 )
                 AT_decl_file( "/private/tmp/a.c" )
                 AT_decl_line( 1 )

0x00000062:         TAG_enumerator [6]  
                     AT_name( "a" )
                     AT_const_value( 0x0000000000000000 )

0x00000068:         TAG_enumerator [6]  
                     AT_name( "b" )
                     AT_const_value( 0x0000000000000001 )

0x0000006e:         TAG_enumerator [6]  
                     AT_name( "c" )
                     AT_const_value( 0x0000000000000002 )

如果我在我的示例文件中添加另一个枚举,它没有在任何地方使用,

enum myenums {a = 0,c};
enum otherenums {d = 0,e,f}; // unused in this CU
int main ()
{
 enum myenums var = b;
 return (int) var;  // break here
}

重新编译并通过dwarfdump再次查看DWARF,我将找不到任何描述其他内容的调试信息 – 它未被使用(在此编译单元中),因此它被省略了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读