我有一个简单的问题:我可以在标识符中的任何位置使用下划线吗?
如果是,请举例说明,如果不是,请解释原因。
是的,下划线可能出现在标识符中的任何地方,_a
、_0_
甚至_
都是有效的标识符。但是有一个规则,你可以在代码中使用其中的哪些,哪些是为"实现"保留的(=编译器和操作系统)。
-
以
_
开头的标识符和大写字母的标识符在任何地方都保留,您不应该自己使用它们。它们可以被编译器自由使用,也可以被未来的语言扩展使用,例如这就是为什么 C 中的官方布尔类型被命名为_Bool
的原因。 -
以
_
开头和小写字母开头的标识符保留在文件范围内,因此不允许将函数或全局变量命名_toto
或类似名称。这些可能与库函数的名称冲突,例如 -
C++保留一行中具有多个
_
的标识符,用于名称重整。如果你曾经想过用 C 编写可从C++调用的代码,你不应该使用这些代码。 -
以
_t
结尾的标识符由 POSIX 为类型保留。如果您想避免将来在新系统上出现可移植性问题,也请避免这些问题。
保留名称还有很多其他规则,我只列出了我记得的关于_
的规则。
写入标识符的规则
-
标识符只能由字母(大写和小写字母)、数字和下划线"_"组成。
-
标识符的第一个字母应为字母或下划线。但是,不鼓励以下划线开头的标识符名称,尽管这是合法的。这是因为,以下划线开头的标识符可能与系统名称冲突。在这种情况下,编译器会抱怨它。一些以下划线开头的系统名称是_fileno、_iob、_wfopen等。
-
标识符的长度没有规则。但是,编译器会区分标识符的前 31 个字符。因此,程序中两个标识符的前 31 个字母应该不同。
前任:
int identifier;
int _identifier;
int new_identifier;
是的,下划线可以用作标识符。举个例子:1988年国际奥CCC冠军
#define _ -F<00||--F-OO--;
int F=00,OO=00;main(){F_OO();printf("%1.3fn",4.*-F/OO/OO);}F_OO()
{
_-_-_-_
_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_
_-_-_-_
}
至于为什么标识符中允许在任何地方使用下划线,答案是:该标准描述了标识符的语法,该标识符由至少一个非数字组成,后跟零个或多个数字或非数字字符
它还将非数字定义为以下字符之一:
_ a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
数字是:
0 1 2 3 4 5 6 7 8 9
因此,遵循此规则,_____
与my_identifier
或_000000AAFF___
一样有效但请注意,存在保留标识符这样的东西,这些标识符也在标准中进行了描述。
再次回答为什么问题:因为标准是这么说的;-P
下划线被视为普通字母/字符
MSDN 标识符的描述
除此之外,通常还有一些编码准则限制您使用下划线,例如,在构造函数中,参数被命名为_name其中类变量的名称是 name。