在 C 程序的宏预处理器中调用内联函数

Calling Inline Function in Macro Preprocessor of a C Program

我对以下宏预处理器定义感到困惑:

#define HOOK_SYSCALL(NAME) original_##NAME = get_sys_call_table_addr()[__NR_##NAME]; 

名为get_sys_call_table_addr()的函数代码如下:

ssize_t *sys_call_table = (ssize_t *)NULL;

void** get_sys_call_table_addr(void)
{
    void *swi_addr=(long *)0xffff0008;
    unsigned long offset=0;
    unsigned long *vector_swi_addr=0;

    offset=((*(long *)swi_addr)&0xfff)+8;
    vector_swi_addr=*(unsigned long *)(swi_addr+offset);

    while(vector_swi_addr++)
    {
        if(((*(unsigned long *)vector_swi_addr)& 0xfffff000)==0xe28f8000)
        {
            offset=((*(unsigned long *)vector_swi_addr)& 0xfff)+8;
            sys_call_table=(void *)vector_swi_addr+offset;
            break;
        }
    }
    return (void **) sys_call_table;
}

我想问一下这个具体线路是否:

get_sys_call_table_addr()[__NR_##NAME];

是否将内联函数作为数组调用?就像我们对普通数组所做的那样,例如阵列[3];

谢谢!!

## 用于连接预处理器标记。假设 NAMEexit。然后 get_sys_call_table_addr()[__NR_##NAME] 将是 get_sys_call_table_addr()[__NR_exit]。这意味着 get_sys_call_table_addr() 被调用并且计算结果将是一个指针。

记住 arr[x]*(arr + x)。假设 __NR_exit 是一个值为 1 的常量。然后,函数返回的结果指针移动 1,然后取消引用。现在将其分配给变量 original_exit.

令牌## 用于将两个令牌连接成一个。例如在上面的例子中 __NR_##NAME 变成了 __NR_NAME。

函数get_sys_call_table_addr() returns a table sys_call_table,这是一个双指针。此 table 应用作数组变量并指向 [__NR_NAME] 指向的地址。

换句话说,get_sys_call_table_addr()[__NR_##NAME] 变为 sys_call_table[__NR_NAME];