MST

星途 面试题库

面试题:C++中extern "C"的作用及用法

请阐述在C++中`extern "C"`的作用是什么,并举例说明如何使用`extern "C"`来实现C与C++代码的函数互调。
13.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

extern "C"的作用

在C++中,extern "C"主要用于解决C和C++之间函数名修饰规则不同的问题。C++为了实现函数重载,会对函数名进行复杂的修饰(mangling),而C语言的函数名修饰规则相对简单。当需要在C++代码中调用C语言函数,或者在C语言代码中调用C++函数时,使用extern "C"可以确保函数名按照C语言的规则进行链接,避免链接错误。

实现C与C++代码函数互调的示例

1. C++调用C函数

C函数代码(c_function.c

#include <stdio.h>

// C语言函数
void c_function() {
    printf("This is a C function.\n");
}

C++调用代码(cpp_call_c.cpp

extern "C" {
    // 声明要调用的C函数
    void c_function(); 
}

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

2. C调用C++函数

C++函数代码(cpp_function.cpp

#include <iostream>

extern "C" {
    // 要被C调用的C++函数
    void cpp_function() {
        std::cout << "This is a C++ function called from C.\n";
    }
}

C调用代码(c_call_cpp.c

// 声明要调用的C++函数
extern void cpp_function(); 

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

在编译时,对于C++调用C函数的情况,需要先编译c_function.c生成目标文件(如c_function.o),再编译cpp_call_c.cpp并链接c_function.o。对于C调用C++函数的情况,先编译cpp_function.cpp生成目标文件(如cpp_function.o),再编译c_call_cpp.c并链接cpp_function.o。具体的编译命令因编译器而异,例如使用GCC编译:

  • 编译c_function.cgcc -c c_function.c
  • 编译cpp_call_c.cpp并链接c_function.og++ cpp_call_c.cpp c_function.o -o cpp_call_c
  • 编译cpp_function.cppg++ -c cpp_function.cpp
  • 编译c_call_cpp.c并链接cpp_function.ogcc c_call_cpp.c cpp_function.o -o c_call_cpp