今天编译 unpv13e (Unix 网络编程卷 1 )示例代码中 libfree/inet_ntop.c 文件,编译器报下面代码的报错,具体是说 size 类型不匹配,然后把 size_t
改成 socklen_t
就可以编译过去了。
const char *
inet_ntop(af, src, dst, size)
int af;
const void *src;
char *dst;
size_t size;
{
switch (af) {
case AF_INET:
return (inet_ntop4(src, dst, size));
case AF_INET6:
return (inet_ntop6(src, dst, size));
default:
errno = EAFNOSUPPORT;
return (NULL);
}
/* NOTREACHED */
}
看这个怪怪的函数定义语法,好陌生,但是确可以编译过去。然后想是不是老式的语法。就去搜索了一下。还真有其他网友提疑问。我特别按照这种定义语法写了测试代码,还真是这样。
于是,我又去查阅一下 K&R C 的书籍( C 语言程序设计第二版),在 1.7 Functions 小节找到如下说明。果真是历史遗留的语法,只是编译器现在还支持。
A note of history: the biggest change between ANSI C and earlier versions is how functions are declared and defined. In the original definition of C, the power function would have been written like this:
/* power: raise base to n-th power; n >= 0 */
/* (old-style version) */
power(base, n)
int base, n;
{
int i, p;
p = 1;
for (i = 1; i <= n; ++i)
p = p * base;
return p;
}
然后书中建议不要使用这种古老的语法,而是使用新的语法(就是我们常用的语法)。猜测现在的编译器还要兼容几十年前的语法,应该还有很多几十年前的代码现在依旧在被使用吧。