MST

星途 面试题库

面试题:C++中extern "C"与链接规范的关系

深入解释`extern "C"`如何影响C++的链接规范,在一个包含多个源文件的项目中,如果部分文件使用C语言编写,部分使用C++编写,怎样正确使用`extern "C"`来确保链接时不会出现符号解析错误?
14.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

extern "C"对C++链接规范的影响

在C++中,编译器会对函数名进行重整(name mangling),以支持函数重载等特性。这意味着不同参数列表的同名函数在目标文件中会有不同的符号名。而C语言没有函数重载,其函数名在目标文件中的符号名就是函数定义时的名字。

extern "C"的作用是告诉C++编译器,按照C语言的链接规范来处理其后声明或定义的函数,即不进行函数名重整,使得这些函数在链接时可以被C语言代码识别。

在多源文件项目中的正确使用

  1. C++调用C函数
    • 在C++头文件中
      extern "C" {
          // 声明C函数
          void cFunction(int arg); 
      }
      
    • 在C源文件中
      #include <stdio.h>
      void cFunction(int arg) {
          printf("C function called with arg: %d\n", arg);
      }
      
  2. C调用C++函数
    • 在C++源文件中
      extern "C" void cppFunction() {
          // C++函数实现
          // 可以在这里使用C++特性
      }
      
    • 在C头文件中
      // 声明C++函数(已被extern "C"修饰,符合C语言链接规范)
      void cppFunction(); 
      
    • 在C源文件中
      #include <stdio.h>
      void callCppFunction() {
          cppFunction();
          printf("Called C++ function\n");
      }
      
  3. 对于多源文件项目
    • 如果有多个C++源文件都要调用C函数,应将extern "C"声明放在头文件中,供各C++源文件包含。
    • 对于C语言源文件,确保在调用C++函数前,相关的C++函数已被正确声明(通过包含合适的头文件,且头文件中对C++函数使用了extern "C"声明)。同时,在构建项目时,要正确设置编译和链接选项,确保C和C++源文件都能正确编译并链接在一起。