c++ 名字粉碎(name mangling)

转自Ibm:

Name mangling is the encoding of
function and variable names into unique names so that linkers can separate
common names in the language. Type names may also be mangled. The
compiler generates function names with an encoding of the types of the function
arguments when the module is compiled. Name
mangling is commonly used to facilitate the overloading feature and visibility
within different scopes. Name mangling also applies to variable names. If
a variable is in a namespace, the name of the namespace is mangled into the
variable name so that the same variable name can exist in more than one
namespace. The C++ compiler also mangles C variable names to identify the
namespace in which the C variable resides.

The scheme for producing a mangled name differs with the object model used to
compile the source code: the mangled name of an object of a class compiled using
one object model will be different from that of an object of the same class
compiled using a different object model. The object model is controlled by
compiler option or by pragma.

Name mangling is not desirable when linking C modules with libraries or
object files compiled with a C++ compiler. To prevent the C++ compiler from
mangling the name of a function, you can apply the extern
"C"
 linkage specifier to the declaration or declarations, as shown in
the following example:

extern "C" {
int f1(int);
int f2(int);
int f3(int);
};

This declaration tells the compiler that references to the functions f1, f2,
and f3 should not be mangled.

The extern
"C"
 linkage specifier can also be used to prevent mangling of
functions that are defined in C++ so that they can be called from C. For
example,

extern "C" {
void p(int){
/* not mangled */
}
};
http://blog.csdn.net/xt_xiaotian/article/details/5431410
http://www.360doc.com/content/11/0402/17/6295074_106726950.shtml

http://www.geeksforgeeks.org/extern-c-in-c/

时间: 2024-10-06 11:49:01

c++ 名字粉碎(name mangling)的相关文章

C++ ABI之名字改变,编译器生成符号研究(以Qt为例)

在C++中,由于重载等技术的存在,编译器要将函数.结构体.类等等的信息传递给链接器,就不能像C语言那样简单地通过函数名来完成,它需要提供额外的参数信息,而还要和C语言共用链接器,这就需要用到名字改编(name mangling),又叫名字修饰(name decoration). 名字改编也罢,但由于历史原因,C++没有这方面的标准(C++没有ABI方面的标准,名字改编只是ABI问题的一部分).于是编译器们各自为政,生成的文件无法通用. 于是:在Windows下,你会发现,同一版本的QtCore4

Python 的类的下划线命名有什么不同?

1,以一个下划线开头的命名 ,如_getFile2,以两个下划线开头的命名 ,如__filename3,以两个下划线开头和结尾的命名,如 __init__()4,其它这些命名有什么不同吗 首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入.不过值得注意的是,如果使用 import a_module 这样导入模块,仍然可以用 a_module._some_var

Chapter 10-01

Please indicate the source: http://blog.csdn.net/gaoxiangnumber1 Welcome to my github: https://github.com/gaoxiangnumber1 ?C++语言的三大约束是:与C兼容.零开销(zero overhead)原则.值语义.§11.7介绍值语义. ?"与C兼容"不仅仅是兼容C的语法,更重要的是兼容C语言的编译模型与运行模型,也就是说能直接使用C语言的头文件和库. ?比方说对于con

动态链接库dll简介

前言 最近发现,自己在电脑之中做了好多技术笔记,但这些关于自己的总结仅限于在自己电脑中,没有与其他人分享交流(虽然也上传到百度文库中),这其实对于做IT的很不好,应该多于别人交流分享,不仅有助于发现自己对某些知识理解上的一些不足和缺陷,还有助于提高沟通交流能力,而且有时你会发现会有意外收获的哦! 其实很早就开通了博客,之前也写过一些博客,但好久没有写过博客了,于是就想利用博客,把自己以前写过的笔记整理一下,跟大家分享一下,共同交流学习,笔记中有什么错误或者不足的地方,希望大家能够提出宝贵的意见和

Windows静态库和动态库区别

个人建议:能使用静态库的就不要使用动态库,能使用隐式调用的就不要用显示调用. 注意:     (1)动态库中的.lib文件叫做导入库,对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息. 静态库中的.lib叫做静态库,本身就包含了实际执行代码.符号表等等 (2)显示调用一定要用extern “C” 变为C标准编译,可杜绝C++的重载 静态库:在链接阶段将汇编生成的目标文件.o与引用库一起链接打包到可执行文件中,可简单看成(.o或者.o

python:类5——Python 的类的下划线命名有什么不同?

首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入.不过值得注意的是,如果使用 import a_module 这样导入模块,仍然可以用 a_module._some_var 这样的形式访问到这样的对象. 在 Python 的官方推荐的代码样式中,还有一种单下划线结尾的样式,这在解析时并没有特别的含义,但通常用于和 Python 关键词区分开来,比如如果我们需

【转载】C++之继承与多态

转自:http://www.cnblogs.com/kunhu/p/3631285.html 在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力”.和纯粹的面向对象程序设计语言不同,C++中的多态有着更广泛的含义.除了常见的通过类继承和虚函数机制生效于运行期的动态多态(dynamic polymorphism)外,带变量的宏,模板,函数重载,运算符重载,拷贝构造等也允许将不同的特殊行为和单个泛化记号相关联,由于这种关联处理于编译期而非运行期,因此被称为静态多态(

python的下划线

首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入.不过值得注意的是,如果使用 import a_module 这样导入模块,仍然可以用 a_module._some_var 这样的形式访问到这样的对象. 在 Python 的官方推荐的代码样式中,还有一种单下划线结尾的样式,这在解析时并没有特别的含义,但通常用于和 Python 关键词区分开来,比如如果我们需

【slighttpd】基于lighttpd架构的Server项目实战(11)—C++的Name Mangling

上一节中,我们介绍了插件作为动态库的加载,其中我们注意到 函数: void* dlsym(void* handle,const char* symbol) 返回的是[symbol对应的地址]. 因此,在我们开发的插件中,SetupPlugin和RemovePlugin函数需要添加extern "C" : extern "C" Plugin* SetupPlugin() { return new MyPlugin(); } extern "C" P