extern c作用

1. 什么是extern c

在C++中,当我们编写程序的时候,会使用一些C++的特性,比如类、虚函数、重载等。但是,在某些场景下,我们需要将C++代码嵌入到其他语言的程序中,例如C、Fortran、汇编等。这就需要用到extern c。

extern "C"告诉编译器是用C的方式进行函数调用,而不是C++的方式。所以,我们在编写函数时,要用C的方式编写,不能使用C++的特性。同时,由于C和C++编译后的函数名称不同,所以需要使用extern "C"关键字告诉编译器使用C的函数名称。

2. extern "C"的使用场景

2.1 和C语言进行交互

在C++中使用extern "C"最常见的场景就是和C语言进行交互。C代码中,函数名称不会随着编译器的不同而改变,而C++代码中,函数名称会根据编译器的不同而改变。因此,在C++代码中调用C语言的函数时,需要使用extern "C"来保证函数名称一致。

例如,我们在C++中调用C语言的函数:

extern "C"{

void foo(); //C语言函数

}

int main(){

foo();

return 0;

}

2.2 导出函数

在一个DLL或so动态库中,需要将函数导出来,以便其他程序可以进行调用。使用extern "C"可以确保函数具有相同的名称、返回类型和参数列表。

例如,在DLL中导出一个函数:

extern "C" __declspec(dllexport) int add(int a, int b){

return a + b;

}

这样,在其他程序中就可以使用相同的函数名称、返回值和参数列表来调用该函数。

2.3 防止函数名重载

C++允许使用相同的函数名称来实现函数的重载。例如:

void foo(int a, int b){

//...

}

void foo(int a){

//...

}

但是,如果我们用C语言编写程序,并且使用了函数名称相同、但是参数列表不同的函数,就会出现重载。这就需要使用extern "C"来防止函数名重载问题。

例如,在C++中编写的代码:

void foo(int a, int b){

//...

}

void foo(int a){

//...

}

int main(){

foo(1, 2); //调用第一个foo

foo(1); //调用第二个foo

return 0;

}

在编译之后,函数名会发生变化:

_Z3fooii

_Z3fooi

由于函数名称发生了变化,无法在C语言中进行调用。因此,我们需要使用extern "C"来保证函数名不会发生变化。

3. 如何使用

使用extern "C"非常简单,只需要在函数定义前添加即可:

extern "C"{

//C语言函数定义

void foo();

}

当然,在DLL等中,还需要使用__declspec(dllexport)来导出函数:

extern "C" __declspec(dllexport) int add(int a, int b){

return a + b;

}

4. 注意事项

1. 在C++中,包含C语言头文件时,需要使用extern "C"。

例如,在C++中使用stdio.h:

extern "C"{

#include <stdio.h>

}

2. 在别的语言中调用C++函数时,函数名称会发生变化。

例如,在C++中定义的函数:

extern "C"{

int foo(int a, int b){

return a + b;

}

}

在别的语言(比如Python)中调用foo函数时,应该调用_foo函数:

import ctypes

lib = ctypes.cdll.LoadLibrary("mylib.so")

print(lib._foo(1, 2))

5. 总结

本文介绍了extern "C"的作用和用法。extern "C"可以确保C++函数具有C语言的调用方式和函数名,以便实现和C语言的交互,导出函数以及避免函数名重载等问题。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签