2010-01-03 37 views
0

工会epoll_data_t样子:epoll_data_t问题(特别是关于C的数据类型)

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是在公开可修改的外部世界中使用的合适的东西。

回答

1
从维基百科[ http://en.wikipedia.org/wiki/Underscore]

许多冲突

直接的 外部标识符链空间 这潜在地交织在一起的各种高电平 编译器,运行时库所需的每个这些编译的 生成的代码 内是可能的,编译器 生成的辅助函数,以及 程序启动代码,其中部分 分数不可避免地从 系统汇编语言编译而来。在此 冲突域中,下划线 字符迅速成为 区分外部链接 空间的主要机制。 C 编译器通常的做法是在所有外部范围下加上前导 下划线 程序标识符以避免冲突 与运行时 语言支持的贡献。此外,当在 C/C++编译器需要引入 名转换成外部连接作为 翻译过程的一部分,这些名称 常常与一些 多个前导或尾随 下划线的组合区分开。

+0

这实际上与这个特定的问题没有关系 - 它是关于类型名称,它在C中没有链接。 – caf 2010-01-04 08:53:59

1

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

2

固定宽度整数类型用C99标准化。在此之前,编译器和库作者介绍了他们自己的类型,其中这些类型可能是一种补遗; afaik MS仍不会运送stdint.h与Visul Studio。