什么时候是'extern C”在Windows中的c ++中需要什么?

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

要回复问题请先登录注册