C ++中extern“ C”的作用是什么?

extern“ C”关键字用于使C ++中的函数名称具有C链接。在这种情况下,编译器不会处理该函数。首先让我们看一下C ++中的重整,然后我们可以讨论extern“ C”关键字。

在C ++中,我们可以使用函数重载功能。使用此功能,我们可以创建具有相同名称的函数。唯一的区别是参数的类型和参数的数量。这里不考虑返回类型。现在的问题来了,C ++如何区分目标代码中的重载函数?

在目标代码中,它通过添加有关参数的信息来更改名称。这里应用的技术称为名称修改。C ++没有用于名称修饰的标准化技术。因此,不同的编译器使用不同的技术。

这是名称修改的示例。重载的函数命名为func(),另一个函数my_function()在那里。

示例

int func(int x) {
   return x*x;
}
double func(double x) {
   return x*x;
}
void my_function(void) {
   int x = func(2); //integer
   double y = func(2.58); //double
}

一些C ++编译器会像下面这样更改它-

示例

int __func_i(int x){
   return x*x;
}
double __func_d(double x){
   return x*x;
}
void __my_function_v(void){
   int x = __func_i(2); //integer
   double y = __func_d(2.58); //double
}

C不支持函数重载,因此,当我们使用C ++链接C代码时,我们必须确保不更改符号名称。以下C ++代码将生成错误。

示例

int printf(const char *format,...);
main() {
   printf("Hello World");
}

输出结果

undefined reference to `printf(char const*, ...)'
ld returned 1 exit status

生成此问题的原因printf()是编译器更改的名称。并且它找不到更新printf()方法的定义。为了克服这个问题,我们必须在C ++中使用extern“ C”。当在此块中使用某些代码时,C ++编译器将确保函数名称没有被破坏。因此名称将不会更改。因此,上面的代码将像这样来解决此问题。

示例

extern "C"{
   int printf(const char *format,...);
}
main() {
   printf("Hello World");
}

输出结果

Hello World

注意:这些代码块在不同的编译器中可能会产生不同的结果。

因此,外部“ C”基本上是一个链接规范。在每个编译器中,我们都必须使用此关键字来指定C链接。另外我们要记住,链接规范必须在命名空间范围内。从外部“ C”忽略类成员