我对使用 ' #include <linux/stat.h>
' 而不是 ' #include <sys/stat.h>
' 的代码印象不深。我也对 version.h 文件包含的代码不感兴趣:
-e #define VERSION "1.5-3"
(该文件是由命令生成的 - ' echo -e '#define...' > version.h
'。呃!)
如果您从以下位置更改功能:
inline int hashed(const char*s)
{
int returnval=atoi(s);
if(returnval>2) returnval=2;
if(returnval<0) returnval=0;
return returnval;
}
至:
static
inline int hashed(const char*s)
{
int returnval=atoi(s);
if(returnval>2) returnval=2;
if(returnval<0) returnval=0;
return returnval;
}
(并修复上面提到的其他问题),然后它在 MacOS X 10.6.2 上使用 GCC "i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646) (dot 1) 编译)”。
测试代码在随机点失败,因为它假定 /bin/touch 中的触摸(在 MacOS X 上是 /usr/bin/touch)。还有很多关于“函数返回类型时忽略类型限定符”的警告,因为“auto.h”将 4 个函数定义为返回“const int”(对于“int”的各种伪装),以及在结构中的函数指针中相同的标题。
我想这归结为作者的经验不足 - 或者测试的平台不足。version.h 命令不需要使用制表符(我相信' -e
'是在命令行中扩展' \t
'符号-应修复Makefile以省略' -e
'并将''替换\t
为简单的空白。
inline
标准 C99中 ' ' 的行为很有趣:
6.7.4 函数说明符
句法
函数说明符:
inline
约束
函数说明符只能在函数标识符的声明中使用。
具有外部链接的函数的内联定义不应包含具有静态存储持续时间的可修改对象的定义,并且不应包含对具有内部链接的标识符的引用。
在托管环境中,内联函数说明符不应出现在 main 的声明中。
语义
使用内联函数说明符声明的函数是内联函数。函数说明符可能出现多次;行为就像它只出现一次一样。使函数成为内联函数意味着对函数的调用尽可能快。118)此类建议的有效程度由实施定义。119)
任何具有内部链接的函数都可以是内联函数。对于具有外部链接的函数,适用以下限制: 如果函数使用内联函数说明符声明,则它也应在同一翻译单元中定义。如果翻译单元中函数的所有文件范围声明都包含不带 extern 的内联函数说明符,则该翻译单元中的定义是内联定义。内联定义不为函数提供外部定义,也不禁止在另一个翻译单元中进行外部定义。内联定义提供了外部定义的替代方案,翻译器可以使用它来实现对同一翻译单元中函数的任何调用。120)
118)例如,通过使用通常的函数调用机制的替代方法,例如“内联替换”。内联替换不是文本替换,也不会创建新函数。因此,例如,在函数体中使用的宏的扩展使用它在函数体出现时的定义,而不是调用函数的位置;标识符指的是正文出现的范围内的声明。同样,该函数具有单个地址,而不管除外部定义之外出现的内联定义的数量。
119)例如,一个实现可能永远不会执行内联替换,或者可能只对内联声明范围内的调用执行内联替换。
120)由于内联定义不同于相应的外部定义和其他翻译单元中的任何其他相应的内联定义,所有具有静态存储持续时间的相应对象在每个定义中也是不同的。