代码之家  ›  专栏  ›  技术社区  ›  David Underhill

gdb中的nil未定义为0x0?

  •  4
  • David Underhill  · 技术社区  · 14 年前

    我正在用gdb(Xcode内部)遍历一些简单的Objective-C代码,发现了一些奇怪的东西。以下是相关片段:

    NSString *s = nil;
    int x = (s == nil);
    

    如我所料 x 在这两行之后 1

    (gdb) print ret
    $1 = (NSString *) 0x0
    (gdb) print (int)(ret==nil)
    $2 = 0
    (gdb) print nil
    $3 = {<text variable, no debug info>} 0x167d18 <nil>
    

    似乎gdb对nil有一些定义,而不是objective-C使用什么(0x0)。有人能解释一下这是怎么回事吗?

    2 回复  |  直到 14 年前
        1
  •  9
  •   Jeremy W. Sherman    14 年前

    当你的代码被编译时, nil 是一个预处理器常量,定义为 __null NULL ), 0L ,或 0

    <objc/objc.h>
    #ifndef nil
    #define nil __DARWIN_NULL /* id of Nil instance */
    #endif
    
    <sys/_types.h>
    #ifdef __cplusplus
    #ifdef __GNUG__
    #define __DARWIN_NULL __null
    #else /* ! __GNUG__ */
    #ifdef __LP64__
    #define __DARWIN_NULL (0L)
    #else /* !__LP64__ */
    #define __DARWIN_NULL 0
    #endif /* __LP64__ */
    #endif /* __GNUG__ */
    #else /* ! __cplusplus */
    #define __DARWIN_NULL ((void *)0)
    #endif /* __cplusplus */
    

    那么,在哪里 是位于该地址的变量的名称:

    (gdb) p nil
    $1 = {<text variable, no debug info>} 0x20c49ba5da6428 <nil>
    (gdb) i addr nil
    Symbol "nil" is at 0x20c49ba5da6428 in a file compiled without debugging.
    

    0个

    (gdb) p *(long *)nil
    $2 = 0
    (gdb) x/xg nil
    0x20c49ba5da6428 <nil>: 0x0000000000000000
    

    这个变量是从哪里来的?GDB可以告诉我们:

    (gdb) i shared nil
      3 Foundation        F -                 init Y Y /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation at 0x20c49ba5bb2000 (offset 0x20c49ba5bb2000)
    

    事实上,当我们检查Foundation中定义的符号时,我们发现

    $ nm -m /System/Library/Frameworks/Foundation.framework/Foundation | grep nil$
    00000000001f4428 (__TEXT,__const) external _nil
    
        2
  •  1
  •   alexyorke    14 年前

    它指向内存中的地址,而不是变量内容。