可以在C中的标识符中的任何位置使用下划线吗?

时间:2013-11-14 07:24:17

标签: c

我有一个简单的问题:我可以在标识符的任何位置使用下划线吗?

如果是,请举例,如果没有,请解释原因。

4 个答案:

答案 0 :(得分:4)

编写标识符的规则

  1. 标识符可以由字母(大写和小写字母),数字和下划线'_'组成。

  2. 标识符的第一个字母应为字母或下划线。但是,不鼓励使用下划线启动标识符名称,尽管它是合法的。这是因为,以下划线开头的标识符可能与系统名称冲突。在这种情况下,编译器会抱怨它。一些以下划线开头的系统名称是_fileno,_iob,_wfopen等。

  3. 标识符的长度没有规则。但是,标识符的前31个字符由编译器区分。因此,程序中两个标识符的前31个字母应该是不同的。

  4. 例如:

        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。