文章转载原地址:http://blog.chinaunix.net/uid-1771330-id-2863801.html
结构体sockaddr_in是在头文件 /usr/include/netinet/in.h 中定义的。sockaddr_in
中有一个
__SOCKADDR_COMMON (sin_);
成员,还有一个
__SOCKADDR_COMMON_SIZE
;
查询相关头文件找到它们的定义:
typedef unsigned short int sa_family_t;
#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family
#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))
这里第一次遇到带有##的语句,最终在网上查找到解释,直接上例子:
1 #define TEST_NUM 6
2
3 #define VAR2STR(var) #var
4 #define JOIN(x, y) x##y
5
6 int main(int argv, char* argc[])
7 {
8 printf("%s: %d\n",VAR2STR(TEST_NUM),JOIN(TEST_, NUM));
9 return 0;
10}
这里面用了这两个符号,下面看一下预处理过后的代码:
int main(int argv, char* argc[])
{
printf("%s: %d\n","TEST_NUM",6);
return 0;
}
再看一下运行结果(程序已经验证):
TEST_NUM: 6
#及##在这一段代码里的作用表现为:
#将紧接后面的无素(遇到空白视为一个元素),转化为字符串,而##则起到连结的作用.
因此,__SOCKADDR_COMMON (sin_)
实际展开为sa_family_t sin_family