C语言 此代码在 GCC 中是什么意思



我正在追踪malloc()在GCC中所做的工作。

我从公共malloc void* __libc_malloc(size_t bytes)函数开始,它调用arena_lookup(),在arena.c中找到:

void* __libc_malloc(size_t bytes)
{
  mstate ar_ptr;
  void *victim;
  void *(*hook) (size_t, const void *) = force_reg (__malloc_hook);
  if (__builtin_expect (hook != NULL, 0))
    return (*hook)(bytes, RETURN_ADDRESS (0));
  arena_lookup(ar_ptr);
  .
  .
}

下面是函数arena_lookup(),我插入了每个函数的定义,称为(虚线包含每个级别的函数定义):

#define arena_lookup(ptr) do { 
    void *vptr = NULL; 
    ptr = (mstate)tsd_getspecific(arena_key, vptr); 
//tsd_getspecific-----------------------------------------------------------------------------------------
    #define tsd_getspecific(key, vptr)  ((vptr) = __libc_tsd_get (void *, MALLOC))
//__libc_tsd_get-----------------------------------------------------------------------------------------
        #define __libc_tsd_get(TYPE, KEY) 
        (*__libc_tsd_address (TYPE, KEY))
//__libc_tsd_address-----------------------------------------------------------------------------------------
            #define __libc_tsd_address(TYPE, KEY)       (&__libc_tsd_##KEY)
//-----------------------------------------------------------------------------------------
} while(0)

我最终libc-tsd.h __libc_tsd_address(TYPE, KEY)定义(&__libc_tsd_##KEY),但我不明白这段代码是什么意思?

这是标记粘贴或标记串联,如此处所述。它连接预处理器令牌以创建要由 C 编译器处理的新令牌。如果它被称为

__libc_tsd_address(void *, MALLOC)

它扩展到:

&__libc_tsd_MALLOC

或者,如果MALLOC也是一个定义的宏,则其扩展将在那里被替换。

相关内容

  • 没有找到相关文章

最新更新