如何有效克服"u_int8_t vs uint8_t"问题

B-K*_*B-K 4 c types

我试图在Solaris中构建一个软件包(的libnet),我发现在Solaris中不存在u_xxx_t,但uxxx_t在sys/types.h中定义

我有两个问题:

1 - 不应该让autotools为我照顾这个吗?

2 - 我想我不是第一个面对这个问题的人(尽管google没什么帮助)是否有标准/有效/正确/快速的方法来克服这个问题?

AnT*_*AnT 15

克服tis最合理的方法是坚持使用类型名称的标准拼写(即使该标准是您正在使用的实现的"未来"标准).C99引入了这种类型名称的标准命名法,而在C99中则是如此uint8_t.因此,即使您使用的是C89/90编译器,我也建议您uint8_t在代码中使用.如果在某个平台上它不可用或拼写不同,您只需引入一个特定于平台的typedef名称来"转换"拼写

typedef u_int8_t uint8_t;
Run Code Online (Sandbox Code Playgroud)

为此,您需要一个包含在每个翻译单元中的头文件.通常,每个项目都有一个专门用于解决此类问题的项目.


JSB*_*ոգչ 7

typename uint8_t是标准的,所以我不确定你找到了什么u_int8_t.

这很简单,你可以快速,愚蠢地使用perl(或sed,如果必须),并解决它造成的任何小问题:

perl -pi.orig -e "s/\bu_(\w+_t)\b/u$1/g" *.c
Run Code Online (Sandbox Code Playgroud)

(这将保存带有.orig后缀的原始未修改文件.)