将外部“C”放入C++代码中具体做什么?

例如:

extern "C" {
   void foo();
}

当前回答

在每个C++程序中,所有非静态函数都在二进制文件中表示为符号。这些符号是唯一标识程序中函数的特殊文本字符串。

在C中,符号名与函数名相同。这是可能的,因为在C中没有两个非静态函数可以具有相同的名称。

因为C++允许重载,并且具有许多C不具备的特性——比如类、成员函数、异常规范——所以不可能简单地使用函数名作为符号名。为了解决这个问题,C++使用了所谓的名称篡改,它将函数名和所有必要的信息(如参数的数量和大小)转换为一些只有编译器和链接器才能处理的奇怪字符串。

因此,如果将函数指定为extern C,编译器不会对其执行名称修改,而是可以直接使用其符号名作为函数名进行访问。

这在使用dlsym()和dlopen()调用此类函数时很方便。

其他回答

在每个C++程序中,所有非静态函数都在二进制文件中表示为符号。这些符号是唯一标识程序中函数的特殊文本字符串。

在C中,符号名与函数名相同。这是可能的,因为在C中没有两个非静态函数可以具有相同的名称。

因为C++允许重载,并且具有许多C不具备的特性——比如类、成员函数、异常规范——所以不可能简单地使用函数名作为符号名。为了解决这个问题,C++使用了所谓的名称篡改,它将函数名和所有必要的信息(如参数的数量和大小)转换为一些只有编译器和链接器才能处理的奇怪字符串。

因此,如果将函数指定为extern C,编译器不会对其执行名称修改,而是可以直接使用其符号名作为函数名进行访问。

这在使用dlsym()和dlopen()调用此类函数时很方便。

它以这样一种方式更改函数的链接,即该函数可以从C调用。实际上,这意味着函数名不会被破坏。

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);

请参阅下面的链接,该链接是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)
{
    //
    //
}