记一个宏定义写法#define HT_FIND(name, head, elm) name##_HT_FIND((head), (elm))

记一个宏定义写法

最近在看libevent源码,看到一个有趣的宏写法。特此记录。方便日后巩固学习。

源码写法:

#define HT_FIND(name, head, elm)   name##_HT_FIND((head), (elm))

首先来简单分析一下:

  1. 定睛一看是一个宏,##是连接符

  2. 在vscode鼠标悬停该宏调用处,就清晰明了了

    // 源码
    dent = HT_FIND(event_debug_map, &global_debug_map, &find);
    
    // 鼠标悬停在宏上查看扩展,扩展如下
    #define HT_FIND(name,head,elm) name ## _HT_FIND((head), (elm))
    扩展到:
    event_debug_map_HT_FIND((&global_debug_map), (&find))
    

接下来模仿该写法写个例子:

#define FUNC(name, value1, value2) name##_INT((value1), (value2))

int add_INT(int a, int b)
{
    cout << "add = " << a + b << endl;
    return a + b;
}

int mul_INT(int a, int b)
{
    cout << "mul = " << a * b << endl;
    return a * b;
}

int sub_INT(int a, int b)
{
    cout << "sub = " << a - b << endl;
    return a - b;
}

int main()
{
    FUNC(add, 9, 2);
    FUNC(mul, 9, 2);
    FUNC(sub, 9, 2);
    return 0;
}

输出结果:

add = 11
mul = 18
sub = 7

我相信看完例子你就明白这种写法了。非常方便。仔细看看是不是这个宏的调用有点像线程定义的写法。比如说我们定义一个相加功能的线程:

thread t1{add, 1, 6};

你可能感兴趣的:(c++,c++)