【发布时间】:2022-01-12 17:02:31
【问题描述】:
这个标识符是否没有问题:
_var
C11,7.1.3 保留标识符,1
以下划线开头的所有标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。
由此可知,以单个下划线开头的用户定义标识符没有问题?
【问题讨论】:
-
人类写的一切都是有问题的。您可能想要更具体。
标签: c language-lawyer naming identifier c11
这个标识符是否没有问题:
_var
C11,7.1.3 保留标识符,1
以下划线开头的所有标识符始终保留用作普通和标记名称空间中具有文件范围的标识符。
由此可知,以单个下划线开头的用户定义标识符没有问题?
【问题讨论】:
标签: c language-lawyer naming identifier c11
不,有问题。
你忘了再引用一句
以下划线和大写字母开头的所有标识符 字母或其他下划线始终保留用于任何用途。
因此,您不能声明以一个下划线后跟一个大写字母开头的标识符。
一般来说,使用以下划线开头的标识符是一种不好的编程风格,因为代码的读者可能会认为这个标识符是由实现保留的。
【讨论】:
是的。只要:
_ 后面既不是大写也不是另一个下划线例如
struct X { int _a; };
int main() { int _a; }
void foo(int _a);
【讨论】:
由此可知,以单个下划线开头的用户定义标识符没有问题?
不,该列表项只是告诉您某些事情是有问题的。它没有声明其他事情没有问题。
同一段告诉您,如果包含声明它们的标头,则标头子条款中列出的所有标识符都是保留的,可能用于任何用途,因此它们是有问题的。该段落中列出了其他问题。
C 2018 6.4.2.1 5 和 6 告诉您,标识符长度超过 5.2.4.1 中列出的最小值(内部标识符为 63 个字符,外部标识符为 31 个字符)可能是个问题;如果两个标识符的差异仅超出了实现强加的重要字符的限制,则未定义行为。
C 2018 6.4.2 还允许标识符具有实现定义的字符,因此此类标识符可能在某些实现中有效,而在其他实现中无效。
【讨论】:
在main函数或者用户自定义函数里面,可以这样写
你不会得到任何编译错误。
int main()
{
int _var;
float _var1;
}
【讨论】: