epoll_data_t问题(特别是关于C数据类型)

时间:2010-01-03 20:55:55

标签: c typing epoll

联盟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在公开可修改为外部世界的联合中使用是正确的。

3 个答案:

答案 0 :(得分:2)

使用C99标准化固定宽度整数类型。在此之前,编译器和库作者引入了他们自己的类型,其中这些类型可能是一个残余; afaik MS仍未向Visul Studio发送stdint.h

答案 1 :(得分:1)

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

  

内部可能发生许多冲突   外部标识符链接空间   这可能会混淆代码   由各种高层产生   编译器,运行时库需要   由这些编译器中的每一个编译器   生成的辅助函数,和   程序启动代码,其中一些   分数不可避免地汇编而成   系统汇编语言。在此之内   碰撞域下划线   人物迅速变得根深蒂固   的主要机制   区分外部联系   空间。这是C的常见做法   编译器预先领先   强调所有外部范围   程序标识符以避免冲突   来自运行时的贡献   语言支持。而且,何时   需要介绍C / C ++编译器   作为一部分的名称成为外部联系   翻译过程中,这些名称   经常与一些人区别开来   多个领导或组合的组合   尾随下划线。

答案 2 :(得分:1)

为编译器/库供应商保留一个前导下划线,以避免在全局命名空间中创建与客户创建的符号冲突的符号。不幸的是,客户也一直在使用它自己的“系统级”声明,第三方库供应商也是如此,迫使供应商开始使用两个下划线。在野外发现了具有3个下划线的符号,但尚未广泛传播。