📜  在C++中名称修饰和外部“ C”(1)

📅  最后修改于: 2023-12-03 15:23:22.666000             🧑  作者: Mango

在C++中名称修饰和外部"C"

在C++中,函数和变量名的命名规则并不像C语言那样简单。在C++中,名称修饰(Name Mangling)是一种编译器将函数和变量名转化为唯一名称的技术,以保证链接器能够正确地链接同名函数和变量。

名称修饰规则

C++编译器使用名称修饰规则来确保在编译时和链接时都能够正确地识别函数和变量。名称修饰规则是为了解决函数重载和作用域的问题。

在C++编译器中,名称修饰规则原则上是不公开的,因为它是编译器的内部机制。由于不同的编译器可能会使用不同的名称修饰规则,因此在使用C++混合编程的时候要注意这点。

以以下代码为例:

int add(int a, int b) {
    return a + b;
}

在GCC的C++编译器中,它生成的名称可能是:

_Z3addii

名称修饰规则通常包括以下几个方面:

  • 包括函数名和参数类型
  • 必须考虑函数重载
  • 返回类型不包括在名称修饰中
外部"C"

在C++和C混合编程时,需要使用extern "C"来告诉编译器,使用C语言的链接方式,将名称修饰取消。

例如:

extern "C" {
    void MyCFunction(int a, int b);
}

这样,其名称就不会被进行名称修饰,就像在C编译器中编写的函数一样。

注意,名称修饰取消仅适用于被包含在extern "C"块中的函数。对于其他函数,仍需要像往常一样进行名称修饰。

总结

C++的名称修饰规则可以确保函数和变量在编译和链接时被正确地预处理。混合编程时需要注意名称修饰规则的不同,使用外部"C"来取消名称修饰,使函数名在C程序中仍然可用。