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

时间:2010-09-16 17:07:50

标签: c++ c windows

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

5 个答案:

答案 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约定。