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

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

在C++中名称修饰和外部“ C”

在C++中,为了支持函数重载,编译器会对函数名和符号进行修饰,也就是添加一些额外的信息来区分不同的函数和重载函数。这种修饰方式被称作名称修饰(name mangling)。

但是,在某些情况下,我们需要使用C++代码调用C语言的函数,这时候就需要使用extern "C"来告诉编译器该函数按照C语言的方式来进行链接。在这种情况下,编译器会直接使用函数名作为符号,而不会进行名称修饰。

下面是一个示例:

// test.c
#include <stdio.h>

void foo() {
    printf("Hello, C!\n");
}

// test.cpp
#include <iostream>

extern "C" void foo();

void bar() {
    std::cout << "Hello, C++!" << std::endl;
    foo();  // 调用C语言的函数
}

int main() {
    bar();
    return 0;
}

在上面的示例中,test.c中的函数foo没有进行名称修饰,test.cpp中使用了extern "C"来告诉编译器该函数不进行名称修饰。在bar函数中,可以直接使用foo来调用C语言的函数。

需要注意的是,如果C语言的函数中有参数或返回值,需要在C++代码中进行类型转换。例如:

// test.c
int add(int a, int b) {
    return a + b;
}

// test.cpp
extern "C" int add(int a, int b);

int main() {
    int a = 1, b = 2;
    int c = add(a, b);  // C++需要进行类型转换
    return 0;
}

总结一下,在C++中需要使用extern "C"来告诉编译器使用C语言的链接方式。同时,在调用C语言的函数时需要进行类型转换。