联盟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在公开可修改为外部世界的联合中使用是正确的。
答案 0 :(得分:2)
使用C99标准化固定宽度整数类型。在此之前,编译器和库作者引入了他们自己的类型,其中这些类型可能是一个残余; afaik MS仍未向Visul Studio发送stdint.h
。
答案 1 :(得分:1)
直接来自维基百科[http://en.wikipedia.org/wiki/Underscore]
内部可能发生许多冲突 外部标识符链接空间 这可能会混淆代码 由各种高层产生 编译器,运行时库需要 由这些编译器中的每一个编译器 生成的辅助函数,和 程序启动代码,其中一些 分数不可避免地汇编而成 系统汇编语言。在此之内 碰撞域下划线 人物迅速变得根深蒂固 的主要机制 区分外部联系 空间。这是C的常见做法 编译器预先领先 强调所有外部范围 程序标识符以避免冲突 来自运行时的贡献 语言支持。而且,何时 需要介绍C / C ++编译器 作为一部分的名称成为外部联系 翻译过程中,这些名称 经常与一些人区别开来 多个领导或组合的组合 尾随下划线。
答案 2 :(得分:1)
为编译器/库供应商保留一个前导下划线,以避免在全局命名空间中创建与客户创建的符号冲突的符号。不幸的是,客户也一直在使用它自己的“系统级”声明,第三方库供应商也是如此,迫使供应商开始使用两个下划线。在野外发现了具有3个下划线的符号,但尚未广泛传播。