论extern "C"的用处?
来源:互联网 发布:php object to string 编辑:程序博客网 时间:2024/05/05 13:49
C++程序(或库、目标文件)中,所有非静态(non-static)函数在二进制文件中都是以“符号(symbol)”形式出现的。这些符号都是唯一的字符串,从而把各个函数在程序、库、目标文件中区分开来。在C中,符号名正是函数名,两者完全一样。而C++允许重载(不同的函数有相同的名字但不同的参数,甚至const重载),并且有很多C所没有的特性──比如类、成员函数、异常说明──几乎不可能直接用函数名作符号名。为了解决这个问题,C++采用了所谓的name mangling。它把函数名和一些信息(如参数数量和大小)杂糅在一起,改造成奇形怪状,只有编译器才懂的符号名。例如,被mangle后的foo可能看起来像foo@4%6^,或者,符号名里头甚至不包括“foo”。
其中一个问题是,C++标准并没有定义名字必须如何被mangle,所以每个编译器都按自己的方式来进行name mangling。有些编译器甚至在不同版本间更换mangling算法(尤其是g++ 2.x和3.x)。前文说过,在显示调用动态库中的函数时,需要指明调用的函数名,即使您搞清楚了您的编译器到底怎么进行mangling的,从而知道调用的函数名被C++编译器转换为了什么形式,,但可能仅仅限于您手头的这个编译器而已,而无法在下一版编译器下工作。
extern "C"即可以解决这个问题。用 extern "C"声明的函数将使用函数名作符号名,就像C函数一样。因此,只有非成员函数才能被声明为extern "C",并且不能被重载。尽管限制多多,extern "C"函数还是非常有用,因为它们可以象C函数一样被dlopen动态加载。冠以extern "C"限定符后,并不意味着函数中无法使用C++代码了,相反,它仍然是一个完全的C++函数,可以使用任何C++特性和各种类型的参数。所以extern "C" 只是告诉编译器编和链接的时候都用c的方式的函数名字,函数里的内容可以为c的代码也可以为c++的。
转自:http://blog.csdn.net/lc_910927/article/details/42393121
- 论extern "C"的用处?
- extern "C" 的用处
- extern "C"的用处
- c/c++ extern的用处详解
- C++ extern(1) extern的用处
- c++中extern的用处
- extern "C"的用法
- “extern c”的使用
- extern "C" 的用意
- extern "C" 的用意
- "extern" C的用法
- extern “C”的使用
- extern "C" 的作用
- extern C的使用方法
- extern "C"的使用
- extern "C"的使用
- extern “C”的作用
- extern "C" 的用意
- 714. Best Time to Buy and Sell Stock with Transaction Fee
- Nodejs + Expressjs+ JWT,JWT使用
- LeetCode--Construct Binary Tree from Preorder and Inorder Traversal
- 记录下HTTP中的一些琐碎
- 关于用户访问请求慢,TTFB时间长的问题分析
- 论extern "C"的用处?
- Android 6.0动态权限申请问题
- 关于html中meta viewport属性
- C++/C 宏定义(define)中# ## 的含义
- caffe 中的一些参数介绍
- PyTorch 深度学习:60分钟快速入门
- SolrCloud Collection 创建
- opengl es文档
- ZigZag Conversion--LeetCode