什么时候在Windows中的c ++中需要"extern C"?

COM*_*Mer 9 c c++ windows

我们知道我们可以直接在c ++中使用c函数,何时需要呢?extern "C"

Gra*_*rks 13

如果你的函数是在.c文件中实现的,那么.cpp文件将需要extern"C"引用,否则它们会引用一个受损的C++风格的函数名,并且链接会失败.

从DLL导出函数也很方便,因此它们以非损坏的名称导出.

  • 这个答案是正确但不完整的,就像@Randolpho的回答一样,这也是正确但不完整的.整个答案将是两者的总和. (3认同)

Ran*_*pho 9

C++函数必须通过C代码而不是C++代码调用时,这是必要的.

基本上,当您希望C++库向后兼容时.

  • 不,不,不......唉!如果一个项目是`C`,不要添加`C++`:将它转换为`C++`,如果需要,将`C`添加到`C++`项目中.*或者(甚至更好的恕我直言)将它保存在"C"中并完全避免使用"C++".* (2认同)
  • 这个答案是正确但不完整的,就像@Graham Perks的回答一样,这也是正确但不完整的.整个答案将是两者的总和. (2认同)

Jer*_*fin 9

有两种不同的用途extern "C".一种是在C++中定义一个你应该能够从CIe调用的函数,你用C++编写代码,但它需要与C代码接口.在这种情况下,您函数定义extern "C":

extern "C" {
    int c_callable_func1() {}
    int c_callable_func2() {}
}
Run Code Online (Sandbox Code Playgroud)

执行此操作时,这些函数的接口必须遵循与C中相同的规则(例如,您不能重载函数或使用任何参数的默认值).

另一个(更常见的)情况是你有用C编写的代码,你希望能够从C++调用.在这种情况下,函数定义与以前完全相同,但函数需要声明/原型化为extern "C".在典型情况下,您希望#include在C或C++文件中使用单个标头,因此结构如下所示:

// myheader.h
#ifndef MY_HEADER_H_INCLUDED_
#define MY_HEADER_H_INCLUDED_

#ifdef __cplusplus
extern "C" {
#endif

    int func1(void);
    void func2(int);

#ifdef __cplusplus
}
#endif

#endif
Run Code Online (Sandbox Code Playgroud)

因此,C++编译器将看到typedefextern "C"块包围的函数声明(和s等),而C编译器将看到原型,而不是被它无法识别的东西包围.

在第一种情况下(C++函数可以从C调用),你通常会以相同的方式构造标题,所以如果需要你也可以用C++调用这些函数(但是在接口上,你仍然会失去C++的所有额外功能)函数重载).