将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,我将找不到任何描述其他内容的调试信息 – 它未被使用(在此编译单元中),因此它被省略了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读