ISO/IEC 9899:2011 条款6.4.2——标识符
6.4.2 标识符
6.4.2.1 通用
语法
1、identifier:
identifier-nodigit
identifier identifier-nondigit
identifier digit
identifier-nondigit:
nondigit
universal-character-name
other implementation-defined characters
nondigit:以下字符之一
_ a到z A到Z
digit:0到9
语义
2、一个标识符是一个非数字的(包括下划线_,小写与大写的拉丁字母,以及其它字符)和数字序列,它指派了一个或多个在6.2.1中所描述的实体。小写与大写字母是有区别的。对于一个标识符的最大长度没有特定限制。
3、在一个标识符中的每个通用字符名应该指派一个字符,其ISO/IEC 10646中的编码坐落于D.1中所指定的范围中。[注:在连接器不能接受扩展字符的系统中,通用字符名可以被用于形成有效的外部标识符。比如,一些在其它方面未被使用的字符或字符序列可以被用于在一个通用字符名中编码\u。扩展字符可以产生一个长的扩展标识符。]初始字符不应该是一个指派一个字符坐落于D.2中所指定的范围的通用字符名。一个实现可以允许多字节字符,它们不是出现在标识符中的基本源字符集的一部分;哪些字符以及它们相应的通用字符名是实现定义的。
4、当预处理标记在翻译阶段7期间被转换为标记时,如果一个预处理标记可以被转换为一个关键字或一个标识符,那么它被转换为一个关键字。
实现限制
5、正如在5.2.4.1中所讨论的,一个实现可以限制一个标识符中的有效初始字符的个数;对于一个扩展名的限制(具有外部连接的一个标识符)可能比一个内部名(一个宏名或一个不具有外部连接的标识符)有更多限制。一个标识符中的有效字符的个数是实现定义的。
6、任何在一个有效字符中有所区别的标识符都是不同的标识符。如果两个标识符仅仅在非有效字符中不同,那么行为是未定义的。
6.4.2.2 预定义的标识符
语义
1、标识符__func__应该被翻译器隐式声明为就好比立即跟在每个函数定义的大括号后面出现,声明为:
static const char __func__ [] = "function-name";
这里,function-name是词法上封闭起来的函数名。[注:由于__func__名保留给使用任意使用(7.1.3),如果任何其它的标识符显式地使用名称__func__来声明,那么行为是未定义的。]
2、__func__被编码为好比已经把隐式的声明写在了源字符集中,然后被翻译到在翻译阶段5中所指明的执行字符集中。
3、例子:考虑以下代码片段:
#include <stdio.h> void myfunc(void) { printf("%s\n", __func__); /* ... */ }
每次这个函数被调用时,它将会打印到标准输出流:myfunc