-qnamemangling(仅限 C++)
适用的调用
| 选项 | xlc (编译 C) | xlC (编译 C++) | xlclang(编译 C) | xlclang++(编译 C++) |
|---|---|---|---|---|
| -qnamemangling | ✓ | ✓ |
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表 。
类别
等效编译指示
| xlC 和其他旧调用命令 | xlclang + + 调用命令 |
|---|---|
| #pragma 名称空间 | 无 |
用途
为从 C++ 源代码生成的外部符号名称选择名称改编方案。
提供了选项和编译指示,以确保与使用先前版本的编译器创建的链接模块的二进制兼容性。 如果不需要确保与较早版本兼容,请勿更改此选项的缺省设置。
语法
缺省值
-qnamemangling (v13)
参数
- ANSI
- 名称修饰方案支持最新的标准 C++ 语言功能。 此子选项等同于 v13。
- v13
- 名称管理方案与 IBM® XL C/C++ V13.1兼容。在 IBM XL C/C++ V13.1中引入了对名称修改方案的若干更改。 首先,在 V13.1之前,假设有两个函数的唯一区别是一个函数具有 cv 限定的参数,而另一个函数的参数不是 cv 限定的。 当您使用
typeid运算符来检索这两个函数的类型时,函数类型的标题名称不一致。 请参阅以下示例。#include <typeinfo> #include <stdio.h> int main( ){ if( typeid(void (*)(int)) == typeid(void (*)(const int)) ) printf("success\n"); else printf("failure\n"); return 0; }在 V13.1之前,两个函数typeid(void (*)(int))和typeid(void (*)(const int))的已管理名称不相同; 在 V13.1中,已管理的名称完全相同,如下表中所示。功能类型 v13 之前的已管理名称 v13 中的已管理名称 typeid(void (*)(int))__type_infoXTPFi_v_ __type_infoXTPFi_v_ typeid(void (*)(const int))__type_infoXTPFCi_v_ __type_infoXTPFi_v_ 其次,在 V13.1之前,未命名名称空间的已管理名称仅通过其文件名来区分它们与其他函数或名称空间。 当多个未命名的名称空间位于具有相同文件名但不同目录的单独文件中时,这些名称空间的已命名名称相同。 V13.1 发行版通过使用已管理的函数名中的文件名对文件目录进行编码来解决此问题。 例如,以下代码包含在目录dir1和目录dir2下具有相同文件名test.cpp的两个文件中:namespace{ struct C{ C(){ printf("%s\n", "C() of c1"); } }c1; }在 V13.1之前,目录dir1和目录dir2下的两个构造函数C()具有相同的管理名称。 当进行静态初始化并且将对象文件链接或装入到主程序时,仅调用或初始化由链接程序标识的第一个构造函数。 在 V13.1中,两个构造函数的已管理名称不同,如下表中所示。函数 v13 之前的已管理名称 v13 中的已管理名称 目录 dir1下的test.cpp:C()__ct__Q2_10test.cpp-01CFv __ct__Q2_101_test_cpp1CFv 目录 dir2下的test.cpp:C()__ct__Q2_10test.cpp-01CFv __ct__Q2_102_test_cpp1CFv - v12
- 名称管理方案与 IBM XL C/C++ V12.1兼容。在此发行版之前,由于忽略了模板类型参数的 cv 限定符,因此名称修饰方案未区分 cv 限定和 cv 限定的模板类型的函数参数。 v12 修订会保留 cv 限定符,因此以不同方式处理 cv 限定和非 cv 限定的函数参数。 例如:
在上述示例中,在 v12 修订之前,template<typename Element> struct Iterator { Iterator() {} Iterator<Element>& operator+=(long d); friend Iterator<Element> operator+(Iterator<Element> it, long d) { it += d; return it; } }; int main() { Iterator<int> iter; Iterator<const int> c_iter; iter = iter+10; c_iter=c_iter+10; }Iterator<const int> operator+(Iterator<const int>, long)()和Iterator<int> operator+(Iterator<int>, long)()具有相同的名称mangling __pl__F8IteratorXTi_l。 修订会区分这两个函数的名称修饰,如下表所示:源名称 v12 之前的已管理名称 v12 和更高版本中的已管理名称 Iterator<const int> operator+(Iterator<const int>, long)__pl__F8IteratorXTi_l __pl__F8IteratorXTCi_l Iterator<int> operator+(Iterator<int>, long)()__pl__F8IteratorXTi_l __pl__F8IteratorXTi_l - v11
- 名称管理方案与 IBM XL C/C++ V11.1兼容。 此子选项具有与 v10相同的效果。
- v10
- 名称管理方案与 IBM XL C/C++ V10.1兼容。 此子选项与 v9 子选项具有相同的效果。
- v9
- 名称修饰方案与 IBM XL C/C++ V9.0兼容。在此发行版之前,名称管理方案在模板实例化中的不同指针到成员模板自变量之间没有不同,并且以下测试用例将无法编译:
从 V9.0 开始,编译器将不同的指针到成员模板自变量视为不同。 以下示例说明了此行为:struct pair { int x, y; pair(int x_, int y_) : x(x_), y(y_) {} }; template <int pair::*PtrToPairMember> struct str { int f(pair& p) { return p.*PtrToPairMember; } }; template <int pair::*PtrToPairMember> g(pair& p) { return p.*PtrToPairMember; } int main() { pair p(0, 1); str<&pair::x> fx; str<&pair::y> fy; if (fx.f(p) != 0 || fy.f(p) != 1) { return 1; } if (g<&pair::x>(p) != 0 || g<&pair::y>(p) != 1) { return 2; } return 0; }源名称 v9 之前的已管理名称 v9 和更高版本中的已管理名称 int str<&pair::y>::f(pair &)f_3strXA0_FR4pair f_3strXAM1y_FR4pair int str<&pair::x>::f(pair &)f_3strXA0_FR4pair f_3strXAM1x_FR4pair int g<&pair::y>(pair &)g_HxM4pairiA0x_R4pair_i g_HxM4pairiA0yx_R4pair_i int g<&pair::x>(pair &)g_HxM4pairiA0x_R4pair_i g_HxM4pairiA0xx_R4pair_i - v8
- 名称管理方案与 IBM XL C/C++ V8.0兼容。对管理方案的若干更改在 IBM XL C/C++ V8.0中生效。 首先,在 V8.0之前,未使用中间级别的 cv 限定符来区分函数特征符中重复参数中的类型。 从 V8.0 开始,使用中间级别的 cv-限定符来确定函数参数之间的等效关系。 由中间级别 cv 限定符的存在所区分的参数不被视为等效参数,而是作为单独的参数进行管理。 以下示例说明了此行为:
源名称 v8 之前的已管理名称 v8 和更高版本中的已管理名称 void f (int**, int* const *)f__FPPiT1 f__FPPiPCPi
注: 也可以使用 nameManglingRule(fnparmscmp) pragma 伪指令来控制此行为。 有关更多信息以及压缩的管理方案的详细信息,请参阅 #pragma namemanglingrule (仅限 C + +)。
其次,在 V8.0之前,仅使用typedef定义中的底层类型来区分函数特征符中重复参数中的类型。 从 V8.0 开始,在模板参数中的 typedef 声明中定义的名称将编码为使用 typedef 作为参数的模板函数的管理名称中的单独参数。 以下示例说明了此行为:源名称 v8 之前的已管理函数名称 v8 和更高版本中的已管理函数名 template <typename T> struct A { typedef int INT; }; template <typename V> int f (A <V>, int, typename A<V>::INT) {} A<int> a; int x = f (a, 1, 10);f__Hi_1AXTi_iT2_i f__Hi_1AXTi_iQ2_1AXTi_9INT_i template <typename T> struct A { typedef A INT; }; template <typename Y> int f (A <int>::INT, const A<Y>) {} A<int> a; int x = f (10, a);f__Hi_1AXTi_T1_i f__Hi_Q2_1AXTi_INT1AXTi__i - v7
- 名称管理方案与 IBM XL C/C++ V7.0兼容。对管理方案的若干更改在 IBM XL C/C++ V7.0中生效。 首先,在 V7.0之前,顶级 cv 限定符用于区分函数特征符中重复参数中的类型。 从 V7.0 开始,根据 C++ 标准,将忽略顶级 cv 限定符以确定函数参数之间的等价。 仅通过存在顶级 cv 限定符来区分的参数被视为等效参数,并且在用于相同类型的重复参数的压缩编码方案中表示。 以下示例说明了此行为:
源名称 v7 之前的已管理名称 v7 和更高版本中的已管理名称 void f (int, const int)f__FiCi ( ) f__Fii ( ) pre-v6
v6f__FiT1 void f (int* const, int* const)f__FCPiCCPi (pre-v6)
f__FPiPi (v6)f__FPiT1
注: 也可以使用 nameManglingRule(fnparmtype) pragma 伪指令来控制此行为。 有关更多信息以及压缩的管理方案的详细信息,请参阅 #pragma namemanglingrule (仅限 C + +)。
其次,在 V7.0之前,非类型整数模板自变量被修饰为以
SP作为前缀的 32 位unsigned十进制数字。 由于此方法在修改 64 位值时引入了模糊性,因此已将此方案更改为以下内容:non-type template argument -> SM #single repeat of a previous parameter -> SP number #positive internal argument -> SN number #negative internal argument当非类型整数模板自变量为正数时,数字将以SP作为前缀。 当非类型整数模板自变量为负数时,该数字以 SN 作为前缀,并且十进制数字不带负号写入。 可以表示的十进制数的范围没有限制。 以下示例说明了此行为:源名称 v7 之前的已管理模板名称 v7 和更高版本中的已管理模板名称 template <int n> int f(){ return N; } int main(){ return f<-3>(); }f__HxiSP429 f__HxiSN3x_v - v6
- 名称修饰方案与 VisualAge® C++ V6.0兼容。 在此发行版之前,函数自变量中的顶级 cv 限定符已编码为已管理的名称。 从 V6.0 开始,根据 C++ 标准,顶级 cv-限定符不会被视为函数自变量的底层类型的一部分,并且 cv-限定符不会被编码在指定的名称中。 以下示例说明了此行为:
源名称 v6 之前的已管理名称 v6 和更高版本中的已管理名称 void f (const int)F__FCi f__Fi void f (int* const)f__FCPi F__FPi
注: 也可以使用 nameManglingRule(fnparmtype) pragma 伪指令来控制此行为。 有关更多信息,请参阅 #pragma namemanglingrule (仅限 C + +)。
- v5
- 名称修饰方案与 VisualAge C++ V5.0兼容。 与 v4 子选项相同。
- v4
- 名称修饰方案与 VisualAge C++ V4.0兼容。 在此发行版之前,具有相同名称和参数列表的函数和函数模板特殊化被视为具有相同的特征符,并且以下测试用例将无法编译:
从 V4.0 开始,编译器将具有相同名称和参数列表的函数和函数模板特殊化视为不同的函数。 以下示例说明了此行为:int f(int) { return 42; } template < class T > int f(T) { return 43; } int main() { f < int > (3); // instantiate int f < int > (int) return f(4); }源名称 v4 之前的已管理名称 v4 和更高版本中的已管理名称 int f (int)f__Fi f__Fi int f <int> (int)f__Fi f__Hi_i_i - v3 | compat
- 名称修饰方案仅在 32 位方式下与 VisualAge C++ V3.0 兼容。
- 出栈
- 废弃当前编译指示设置并还原为先前编译指示伪指令指定的设置。 如果未指定先前的编译指示,请还原为命令行或缺省选项设置。
预定义的宏
无。
