我正在查看sockaddr.h中的以下socket api代码,它的定义为
#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family
这个#define是如何工作的?
答案 0 :(得分:2)
##
是C中的宏标记连接(或token pasting)运算符。
这意味着
#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix family
__SOCKADDR_COMMON(foo);
将扩展为
sa_family_t foo family
会导致编译错误,而不是正确地扩展到
sa_family_t foofamily
没有它。
为什么需要 ##
运算符?简单;你不能sa_prefixfamily
,因为它本身就变成了一个宏令牌(一个未定义的令牌)。
答案 1 :(得分:0)
__SOCKADDR_COMMON(sa_prefix)
#define
d的方式,
__SOCKADDR_COMMON(foo)
扩展为字符串sa_family_t foofamily
。