我们知道我们可以直接在 c ++ 中使用 c 函数,何时需要extern "C"
?
答案 0 :(得分:13)
如果你的函数是在.c文件中实现的,.cpp文件将需要extern“C”引用,否则它们会引用一个受损的C ++风格的函数名,并且链接将失败。
从DLL导出函数也很方便,因此它们以非错位名称导出。
答案 1 :(得分:9)
必须使用C++
代码而不是C
代码调用C++
函数。
基本上,当您希望C++
库向后兼容时。
答案 2 :(得分:9)
extern "C"
有两种不同的用途。一种是在C ++中定义一个应该能够从C调用的函数。即,您在C ++中编写代码,但它需要与C代码接口。在这种情况下,您将函数定义为extern "C"
:
extern "C" {
int c_callable_func1() {}
int c_callable_func2() {}
}
执行此操作时,这些函数的界面必须遵循与C中相同的规则(例如,您不能重载函数或使用任何参数的默认值)。
另一个(更常见的)情况是你有用C编写的代码,你希望能够从C ++调用。在这种情况下,函数 definitions 保持与以前完全相同,但函数需要声明/原型为extern "C"
。在典型情况下,您希望在C或C ++文件中使用可以为#include
d的单个标头,因此结构如下所示:
// 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
因此,C ++编译器将看到由typedef
块包围的函数声明(和extern "C"
s等),而C编译器将看到原型,而不是它不包含的东西认。
在第一种情况下(C ++函数可以从C调用),你通常会以相同的方式构造标题,所以如果需要你也可以用C ++调用这些函数(但是在界面上,你仍然会失去所有额外的功能)像函数重载一样的C ++。
答案 3 :(得分:4)
如您所知,c ++支持函数重载,它使用不同的参数多次定义相同的函数或方法。为此,编译器必须为每个符号添加一些符号...例如,编译器将在以下声明中更改函数名称foo 来自
void foo(int f,char c);
到
foo@i&c
不幸的是,C不支持这一点。编译后,所有函数名称保持不变。因此,要从c调用c ++函数,您必须知道修改后的确切名称,并且我认为从编译器到另一个编译器很难和不同。
解决这个问题并且可以从c调用c ++函数并阻止编译器更改你必须使用这个关键字的名称,如
extern "C" {
void foo(int f,char c);
}
就是这样!!!
答案 4 :(得分:3)
因为C和C ++编译器生成的函数签名不同 - 即使使用C ++,也会为C函数设置C约定。