将外部“C”放入C++代码中具体做什么?
例如:
extern "C" {
void foo();
}
将外部“C”放入C++代码中具体做什么?
例如:
extern "C" {
void foo();
}
当前回答
C++修改函数名以从过程语言创建面向对象语言
大多数编程语言都不是建立在现有编程语言之上的。C++是建立在C之上的,而且它是一种基于过程编程语言的面向对象编程语言,因此,有一些C++表达式,如extern“C”,提供了与C的向后兼容性。
让我们看一下以下示例:
#include <stdio.h>
// Two functions are defined with the same name
// but have different parameters
void printMe(int a) {
printf("int: %i\n", a);
}
void printMe(char a) {
printf("char: %c\n", a);
}
int main() {
printMe('a');
printMe(1);
return 0;
}
C编译器不会编译上述示例,因为相同的函数printMe被定义了两次(即使它们具有不同的参数int A vs char A)。
gcc-o printMe printMe.c&&/printMe;1个错误。PrintMe定义了多次。
然而,C++编译器将编译上述示例。printMe定义两次并不重要。
g++-o printMe printMe.c&&/printMe;
这是因为C++编译器基于函数的参数隐式重命名(mangles)函数。该语言被设计为面向对象的——用相同名称的方法(函数)创建不同的类,并基于不同的参数重写方法名称(方法重写)。
外部“C”所说的是“不要破坏C函数名”
尽管C++是建立在C之上的,但破坏可能会导致C代码混乱。例如,假设我们有一个名为“parent.C”的遗留C文件,其中包含来自不同头文件的函数名,“parent.h”、“child.h”等。因此,“parent.h”和“child.h”头文件中的函数名也需要修改。对于一些文件来说,这可能没什么问题,但如果C程序很复杂,修改可能会很慢,并导致代码损坏,因此可以提供一个关键字,告诉C++编译器不要修改函数名。
extern“C”关键字告诉C++编译器不要篡改(重命名)C函数名。
例如:
extern“C”void printMe(int a);
其他回答
由C编译器编译的函数void f()和由C++编译器编译的同名函数void f()不是同一个函数。如果您用C编写了该函数,然后尝试从C++调用它,那么链接器将查找C++函数,而找不到C函数。
extern“C”告诉C++编译器您有一个由C编译器编译的函数。一旦你告诉它它是由C编译器编译的,C++编译器就会知道如何正确调用它。
它还允许C++编译器以C编译器可以调用的方式编译C++函数。该函数将正式成为一个C函数,但由于它是由C++编译器编译的,因此它可以使用所有C++特性,并具有所有C++关键字。
在不与其他好答案冲突的情况下,我将添加一点我的示例。
C++编译器的作用是:它在编译过程中破坏了名称,因此我们需要告诉编译器要特别对待C实现。
当我们制作C++类并添加外部“C”时,我们告诉C++编译器我们正在使用C调用约定。
原因(我们从C++调用C实现):要么我们想从C++调用C++函数,要么从C调用C++函数(C++类…等在C中不起作用)。
请参阅下面的链接,该链接是Geeks for Geeks对外部“C”用法的解释。从下面的页面添加重要信息。
考虑函数f()的以下声明
int f (void) { return 1; }
int f (int) { return 0; }
void g (void) { int i = f(), j = f(0); }
C++编译器可能会将上述名称更改为以下名称(来源:Wiki)
int __f_v (void) { return 1; }
int __f_i (int) { return 0; }
void __g_v (void) { int i = __f_v(), j = __f_i(0); }
https://www.geeksforgeeks.org/extern-c-in-c/
extern“C”是一个链接规范,用于调用Cpp源文件中的C函数。我们可以调用C函数、编写变量和包含头。函数在外部实体中声明,并在外部定义。语法为
类型1:
extern "language" function-prototype
类型2:
extern "language"
{
function-prototype
};
eg:
#include<iostream>
using namespace std;
extern "C"
{
#include<stdio.h> // Include C Header
int n; // Declare a Variable
void func(int,int); // Declare a function (function prototype)
}
int main()
{
func(int a, int b); // Calling function . . .
return 0;
}
// Function definition . . .
void func(int m, int n)
{
//
//
}
extern“C”是指由C++编译器识别,并通知编译器注意到的函数是(或将)以C样式编译的,因此在链接时,它链接到来自C的函数的正确版本。