【问题标题】:Are user-defined identifiers beginning with a single underscore non-problematic?用户定义的标识符是否以单个下划线开头没有问题?
【发布时间】:2022-01-12 17:02:31
【问题描述】:

这个标识符是否没有问题:

_var

C11,7.1.3 保留标识符,1

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

由此可知,以单个下划线开头的用户定义标识符没有问题?

【问题讨论】:

  • 人类写的一切都是有问题的。您可能想要更具体。

标签: c language-lawyer naming identifier c11


【解决方案1】:

不,有问题。

你忘了再引用一句

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

因此,您不能声明以一个下划线后跟一个大写字母开头的标识符。

一般来说,使用以下划线开头的标识符是一种不好的编程风格,因为代码的读者可能会认为这个标识符是由实现保留的。

【讨论】:

  • 确实!只是错过了“不以大写字母或另一个下划线开头”。
【解决方案2】:

是的。只要:

  • 在块范围内(包括枚举/结构/联合标签)
  • OR 是结构/联合成员
  • OR 是函数参数
  • _ 后面既不是大写也不是另一个下划线

例如

struct X { int _a; };
int main() { int _a; }
void foo(int _a);

【讨论】:

  • 还有函数范围(用于标签)和结构、联合和枚举标签(单独的名称空间)。此外,它更符合 C 标准,包括函数原型范围而不是参数。在不是定义的函数声明中,参数名称具有函数原型范围。在函数定义中,它们具有块范围,已列出。
【解决方案3】:

由此可知,以单个下划线开头的用户定义标识符没有问题?

不,该列表项只是告诉您某些事情是有问题的。它没有声明其他事情没有问题。

同一段告诉您,如果包含声明它们的标头,则标头子条款中列出的所有标识符都是保留的,可能用于任何用途,因此它们是有问题的。该段落中列出了其他问题。

C 2018 6.4.2.1 5 和 6 告诉您,标识符长度超过 5.2.4.1 中列出的最小值(内部标识符为 63 个字符,外部标识符为 31 个字符)可能是个问题;如果两个标识符的差异仅超出了实现强加的重要字符的限制,则未定义行为。

C 2018 6.4.2 还允许标识符具有实现定义的字符,因此此类标识符可能在某些实现中有效,而在其他实现中无效。

【讨论】:

    【解决方案4】:

    在main函数或者用户自定义函数里面,可以这样写

    你不会得到任何编译错误。

    int main()
    {
     int _var;
     float _var1;
    }
    

    【讨论】:

    • 这是真的,但不是 OP 所要求的。
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2012-05-28
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多