-qnamemangling(仅限 C++)

适用的调用

表 1. 接受给定选项的调用
选项 xlc (编译 C) xlC (编译 C++) xlclang(编译 C) xlclang++(编译 C++)
-qnamemangling    
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表

类别

可移植性和迁移

等效编译指示

表 2。 两个类别的调用的编译指示等效项
xlC 和其他旧调用命令 xlclang + + 调用命令
#pragma 名称空间

用途

为从 C++ 源代码生成的外部符号名称选择名称改编方案。

提供了选项和编译指示,以确保与使用先前版本的编译器创建的链接模块的二进制兼容性。 如果不需要确保与较早版本兼容,请勿更改此选项的缺省设置。

语法

操作语法

读取语法图跳过可视语法图  -q namemangling = v13v12v11v10v9v8v7v6v5v4v3ansicompat

编译指示语法

读取语法图跳过可视语法图 # pragma namemangling ( v13v12v11v10v9v8v7v6v5v4v3ansicompatpop )

缺省值

-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 限定的函数参数。 例如:
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;
}
在上述示例中,在 v12 修订之前, 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兼容。
在此发行版之前,名称管理方案在模板实例化中的不同指针到成员模板自变量之间没有不同,并且以下测试用例将无法编译:
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.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
基于 XL 的前端开始
注: 也可以使用 nameManglingRule(fnparmscmp) pragma 伪指令来控制此行为。 有关更多信息以及压缩的管理方案的详细信息,请参阅 #pragma namemanglingrule (仅限 C + +)
基于 XL 的前端端
其次,在 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
v6
f__FiT1
void f (int* const, int* const)
f__FCPiCCPi (pre-v6)
f__FPiPi (v6)
f__FPiT1
基于 XL 的前端开始
注: 也可以使用 nameManglingRule(fnparmtype) pragma 伪指令来控制此行为。 有关更多信息以及压缩的管理方案的详细信息,请参阅 #pragma namemanglingrule (仅限 C + +)
基于 XL 的前端端

其次,在 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
基于 XL 的前端开始
注: 也可以使用 nameManglingRule(fnparmtype) pragma 伪指令来控制此行为。 有关更多信息,请参阅 #pragma namemanglingrule (仅限 C + +)
基于 XL 的前端端
v5
名称修饰方案与 VisualAge C++ V5.0兼容。 与 v4 子选项相同。
v4
名称修饰方案与 VisualAge C++ 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.0 开始,编译器将具有相同名称和参数列表的函数和函数模板特殊化视为不同的函数。 以下示例说明了此行为:
源名称 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 兼容。
出栈
废弃当前编译指示设置并还原为先前编译指示伪指令指定的设置。 如果未指定先前的编译指示,请还原为命令行或缺省选项设置。

预定义的宏

无。

相关信息