标识

标识 提供以下语言元素的名称:
  • 函数
  • 对象
  • 标签
  • 函数参数
  • 宏和宏参数
  • 类型定义
  • 枚举类型和枚举符
  • 结构和并集名称
  • 仅限 C + + 班级和班级成员
  • 仅限 C + + 模板
  • 仅限 C + + 模板参数
  • 仅限 C + + 名称空间
标识由任意数量的字母,数字或下划线字符组成,格式如下:
读取语法图跳过可视语法图字母_字母数字_

标识中的字符

标识中的第一个字符必须是字母或 _ (下划线) 字符; 但是,以下划线开头的标识被认为是较差的编程样式。

编译器在标识中区分大写字母和小写字母。 例如, PROFITprofit 表示不同的标识。 如果指定小写 a 作为标识名称的一部分,那么不能在其位置替换大写 A ; 必须使用小写字母。

在 C99 语言级别允许 在 C++ 和 中使用基本源字符集之外的字母和数字的通用字符名称。 仅限 C + + 开始 在C++中,必须使用 选项进行编译,以支持通用字符名称。 -qlanglvl=ucs 仅限 C++ 结束

IBM 扩展开始 在使用 -qdollar 编译器选项或包含该选项的扩展语言级别之一进行编译时,美元符号可能会出现在标识符名称中。IBM 扩展结束

保留标识

带有两个初始下划线或后跟大写字母的初始下划线的标识将全局保留以供编译器使用。

C 仅开始以单个下划线开头的标识符在普通名称空间和标记名称空间中均保留为文件范围的标识符。仅限 C 结束

仅限 C + + 开始以单个下划线开头的标识符在全球命名空间中是保留的。仅限 C++ 结束

虽然如果不包含相应的头,那么系统调用和库函数的名称不是保留字,但请避免将它们用作标识。 预定义名称的重复可能会导致代码的维护者产生混淆,并可能在链接时或运行时导致错误。 如果在程序中包含库,请注意该库中的函数名,以避免名称重复。 使用标准库函数时,应始终包含相应的头。

__func__ 预定义标识

C99 预定义标识 __func__ 使函数名可供在函数中使用。 仅限 C + +XL C/C++ 编译器作为 IBM 扩展支持此功能。仅限 C + + 在每个函数定义的开头括号之后,编译器都会隐式声明。 __func__ 产生的行为仿佛已经做出了以下声明:
static const char __func__[] = "function-name";
其中 function-name 是词法外层函数的名称。 未对函数名进行修饰。

仅限 C + + 开始函数名称由外围类名或函数名限定。 例如,如果 foo 是类 X的成员函数,那么 foo 的预定义标识为 X::foo。 如果在 main的主体中定义了 foo ,那么 foo 的预定义标识为 main::X::foo

模板函数或成员函数的名称反映实例化的类型。 例如,模板函数 foo 的预定义标识符,用 int, template<classT> void foo() 实例化,则为 foo<int>仅限 C++ 结束

出于调试目的,您可以显式使用 __func__ 标识来返回显示该标识的函数的名称。 例如:

#include <stdio.h>

void myfunc(void)    {  
         printf("%s\n",__func__);  
         printf("size of __func__ = %d\n", sizeof(__func__));  
}  

int main() {  
     myfunc();  
} 

程序的输出为:

myfunc  
size of __func__ = 7 

在函数定义中使用 assert 宏时,该宏会在标准错误流上添加外层函数的名称。

组合件标签(IBM 扩展)

编译器将源代码中的每个非静态外部变量和函数名绑定到它在对象文件和发出的任何组合件代码中生成的名称。 为了与 GCC 兼容,编译器实现了对标准 C 和 C++ 的扩展,该扩展允许您通过将组合件 标签 应用于全局变量或函数原型的声明来指定要在对象文件和组合件代码中使用的名称。 您还可以定义不以下划线开头的名称,即使在通常将下划线添加到函数或变量的名称前面的系统上也是如此。

仅限 C + + 开始您可以将装配标签与成员函数以及全局命名空间以外的其他命名空间中声明的函数和变量一起使用。仅限 C++ 结束

组合件标签语法

读取语法图跳过可视语法图 声明符 asm__asm____asm ( " 字符串型文字 " ) 初始化方法

string_literal 是要绑定到给定对象或函数的有效组合件名称。

以下是组合件标签规范的示例:
void func3() __asm__("foo3");    
int i __asm("abc");             
char c asm("abcs") = 'a';					

仅限 C + + 开始为了区分过载函数,XL C++会在目标文件中修改函数名称。 因此,如果使用组合件标签来映射函数名,那么必须使用目标函数的已管理名称。 此外,必须确保为变量指定的组合件标签名称与任何已指定的名称都不冲突。 或者,您可以通过声明目标函数具有 C 连接来防止名称混淆;更多信息,请参阅名称混淆(仅限 C++ )。仅限 C++ 结束

以下限制适用于组合件标签的使用:
  • 不能在局部变量或静态变量上指定组合件标签。
  • 同一组合件标签名称不能应用于同一编译单元中的多个标识 (在 C++ 中,这是在修饰后的名称)
  • 除非将标签名称和标识名称用于同一变量或函数声明,否则组合件标签名称不能与同一编译单元中的任何其他全局标识名称 (在 C++ 中,名称在修饰后) 相同。
  • 不能在 typedef 声明上指定组合件标签。
  • 组合件标签不能与先前 #pragma map 伪指令在其他变量或函数上指定的名称相同。 同样,由 #pragma map 伪指令指定的映射名称不能与由另一变量或函数上的先前组合件标签指定的名称相同。
  • 不能将组合件标签应用于已由 #pragma map 伪指令在该变量或函数的先前声明中映射到其他名称的标识。 同样,不能对先前已由组合件标签重新映射的标识指定 #pragma map 伪指令。
  • C 仅开始如果您对同一个变量或函数的多个声明应用了不同的标签,则优先使用第一个说明,所有后续的汇编标签都会在发出警告后忽略。
  • 仅限 C + + 开始以下任何产品均不能贴装配标签:
    • 成员变量声明
    • 友元声明
    • 模板函数和成员声明,或者模板中包含的任何声明
    • 虚拟成员函数
    • 构造函数和析构函数