0

工会epoll_data_t看起来像:

typedef union epoll_data {  
    void *ptr;  
    int fd;  
    __uint32_t u32;  
    __uint64_t u64;  
} epoll_data_t;

这更像是一个一般的 C 问题,但为什么使用前导双下划线 __uint{32,64} 类型而不是仅使用不带下划线的 uint{32,64} 类型?我真的不明白为什么/何时使用下划线版本,但我认为没有下划线的 uint32 将是在可公开修改的联合中使用的正确方法。

4

3 回答 3

2

固定宽度整数类型使用 C99 标准化。在此之前,编译器和库的作者介绍了他们自己的类型,其中这些可能是残余的;afaik MS 仍然没有stdint.h随 Visul Studio 一起提供。

于 2010-01-03T21:15:33.760 回答
1

直接来自维基百科 [ http://en.wikipedia.org/wiki/Underscore]

在外部标识符链接空间内可能会发生许多冲突,这些冲突可能会混合各种高级编译器生成的代码、每个编译器所需的运行时库、编译器生成的辅助函数和程序启动代码,其中一部分不可避免地是从系统汇编中编译的语。在这个冲突域中,下划线字符迅速成为区分外部链接空间的主要机制。C 编译器的常见做法是在所有外部范围程序标识符前加上前导下划线,以避免与运行时语言支持的贡献发生冲突。此外,当 C/C++ 编译器需要在翻译过程中将名称引入外部链接时,

于 2010-01-03T21:05:20.253 回答
1

前导下划线保留给编译器/库供应商,以避免在全局命名空间中创建与客户创建的符号冲突的符号。不幸的是,客户也一直在将其用于他们自己的“系统级”声明,就像 3rd 方库供应商一样,迫使供应商开始使用两个下划线。在野外发现了带有 3 个下划线的符号,但尚未广泛使用。

于 2010-01-03T21:12:55.293 回答