在C变量名定义中使用下划线的原因是什么?

在C变量名定义中使用下划线的原因是什么?,c,C,我试图理解开发人员何时需要使用前面的“\u1”定义C变量。原因是什么 例如: uint32_t __xyz_ = 0; 这是C实现的头文件中用于全局符号的技巧,以防止最终与用户定义的其他符号发生冲突 由于C缺少名称空间特性,这是避免与用户发生名称冲突的基本方法 不鼓励在自己的头文件和源文件中声明这样的符号,因为这样会在代码和C实现之间引入命名冲突。即使这不会在您当前的实现上产生冲突,您仍然容易在不同的/未来的实现之间发生奇怪的冲突,因为它们可以自由地使用以下划线为前缀的其他符号。这是在C实现的

我试图理解开发人员何时需要使用前面的“\u1”定义
C
变量。原因是什么

例如:

uint32_t __xyz_ = 0;

这是C实现的头文件中用于全局符号的技巧,以防止最终与用户定义的其他符号发生冲突

由于C缺少名称空间特性,这是避免与用户发生名称冲突的基本方法


不鼓励在自己的头文件和源文件中声明这样的符号,因为这样会在代码和C实现之间引入命名冲突。即使这不会在您当前的实现上产生冲突,您仍然容易在不同的/未来的实现之间发生奇怪的冲突,因为它们可以自由地使用以下划线为前缀的其他符号。

这是在C实现的头文件中用于全局符号的技巧,以防止最终与用户定义的其他符号发生冲突

由于C缺少名称空间特性,这是避免与用户发生名称冲突的基本方法


不鼓励在自己的头文件和源文件中声明这样的符号,因为这样会在代码和C实现之间引入命名冲突。即使这不会在您当前的实现上产生冲突,您仍然容易在不同的/未来的实现之间发生奇怪的冲突,因为它们可以自由地使用以下划线为前缀的其他符号。

这可能会有所帮助,来自C99,7.1.3(“保留标识符”):

  • 以下划线和大写字母或其他字母开头的所有标识符 下划线始终保留供任何使用

  • 所有以下划线开头的标识符始终保留用作标识符 文件范围在普通和标记名空间中

寓意:对于普通用户代码,最好不要以下划线开头标识符


(在一个相关的注释中,我认为您还应该避免使用尾随的
\u t
命名类型,这是为标准类型保留的。)

也许这有助于C99,7.1.3(“保留标识符”):

  • 以下划线和大写字母或其他字母开头的所有标识符 下划线始终保留供任何使用

  • 所有以下划线开头的标识符始终保留用作标识符 文件范围在普通和标记名空间中

寓意:对于普通用户代码,最好不要以下划线开头标识符


(在一个相关的注释中,我认为您也应该避免使用尾随的
\u t
命名类型,这是为标准类型保留的。)

无论是否为C,前导下划线都为程序员提供了一个状态指示,因此他不必去查找它。在PHP或任何面向对象语言中,我们处理由1000多位作者编写的数以万计的属性和方法,看到下划线前缀就不需要深入挖掘类并查找其声明的私有、受保护或公共。这大大节省了时间。这种做法始于C之前,我敢肯定…

无论是否为C,前导下划线都为程序员提供了一个状态指示,因此他不必去查找它。在PHP或任何面向对象语言中,我们处理由1000多位作者编写的数以万计的属性和方法,看到下划线前缀就不需要深入挖掘类并查找其声明的私有、受保护或公共。这大大节省了时间。练习在C之前就开始了,我相信…

您必须询问作者欢迎使用StackOverflow!首先要意识到的是,这个网站不是一个论坛。这是一个问答网站。提出一个好问题,如果你觉得满意,准备好接受答案。可能的副本你必须问作者欢迎来到StackOverflow!首先要意识到的是,这个网站不是一个论坛。这是一个问答网站。提出一个好问题,如果您觉得满意,请准备接受答案。
\t
预订可能是POSIX的重复,不是吗?@awoodland:我不是100%确定。如果有人能说出这条规则的来源,我将不胜感激。这就是说,
*\u t
类型在C标准中非常普遍,因此坚持这一策略可能是件好事。它们的关键位是:和推论的第二个表中的“any header”
\u t
:开发人员只需要在实现C语言(和库)时定义保留名称。因此,如果你没有为编译器或stdlib做出贡献,那就不是你。
\t
保留是来自POSIX的,不是吗?@awoodland:我不是100%确定。如果有人能说出这条规则的来源,我将不胜感激。这就是说,
*\u t
类型在C标准中非常普遍,因此坚持这一策略可能是件好事。它们的关键位是:和推论的第二个表中的“any header”
\u t
:开发人员只需要在实现C语言(和库)时定义保留名称。因此,如果你没有为编译器或stdlib做贡献,那就不是你。它是一个保留名称,为实现保留。听起来是一个很好的方式来看待未来一个奇怪的问题。@awoodland:我看不出否决投票的理由。我不鼓励任何人在自己的头文件中采用这种命名约定。我不同意“为了防止冲突”和“避免名称冲突的基本方法”——它根本不能防止冲突,事实上,它引入了一种全新的可能冲突类别,具有完全合法的实现。我更愿意看到一个类似于“有缺陷地试图阻止c