我有一个简单的问题:我可以在标识符的任何位置使用下划线吗?
如果是,请举例,如果没有,请解释原因。
答案 0 :(得分:4)
编写标识符的规则
标识符可以由字母(大写和小写字母),数字和下划线'_'组成。
标识符的第一个字母应为字母或下划线。但是,不鼓励使用下划线启动标识符名称,尽管它是合法的。这是因为,以下划线开头的标识符可能与系统名称冲突。在这种情况下,编译器会抱怨它。一些以下划线开头的系统名称是_fileno,_iob,_wfopen等。
标识符的长度没有规则。但是,标识符的前31个字符由编译器区分。因此,程序中两个标识符的前31个字母应该是不同的。
例如:
int identifier;
int _identifier;
int new_identifier;
答案 1 :(得分:4)
是的,下划线可能会出现在标识符的任何位置,_a
,_0_
甚至_
都是有效的标识符。但是有一些规则可以在你的代码中使用,哪些是为“实现”(=编译器和操作系统)保留的。
以_
开头的标识符和大写字母随处可见,您不应该自己使用它们。它们可以由编译器自由使用,也可以由未来的语言扩展使用,例如,这就是C中的官方布尔类型被命名为_Bool
的原因。
以_
开头的标识符和一个小写字母在文件范围内保留,因此不允许您命名函数或全局变量_toto
或类似的东西。这些可能与库函数的名称冲突,例如
连续多个_
的标识符由C ++保留用于名称修改。如果你想过在C语言中编写可以从C ++中调用的代码,你就不应该使用它们。
以_t
结尾的标识符由POSIX保留用于类型。如果您想避免在新系统上出现未来的可移植性问题,请避免使用这些问题。
保留名称还有很多其他规则,我只列出了我记得有关_
的那些规则。
答案 2 :(得分:3)
是的,下划线可用作标识符。这是一个例子:The IOCCC winner of 1988
#define _ -F<00||--F-OO--;
int F=00,OO=00;main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
_-_-_-_
_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_
_-_-_-_
}
至于为什么在标识符的任何地方允许使用下划线,答案是:标准描述了由至少一个 nondigit 组成的标识符的语法,然后是零个或多个数字或非数字字符
它还将 nondigits 定义为以下字符之一:
_ a b c d e f g h i j k l m n o p q r s t u v x 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___
一样有效。
但要注意保留标识符和these, too, are described in the standard之类的东西
再次回答为什么的问题:因为标准是这么说的;-P
答案 3 :(得分:0)
Underscore被视为普通字母/字符
MSDN Desciption of identifiers
除此之外,通常会有一些编码指南限制您使用下划线,例如:在构造函数中,参数名为_name,其中类变量的名称为name。