易截截图软件、单文件、免安装、纯绿色、仅160KB

C++中extern “C”详解!!

一直知道在C++中用extern “C” {
}调用C语言,但是不知道为什么,虽然也知道编译器的命名规则,不过没有联想到这个上面,看到这篇文章,才恍然大悟。不过,因为自己一直在linux下使
用C语言,没有使用C++的经验的缘故吧,希望以后能有,这样才能融会贯通。
关键点:函数重载,命名规则
一、C++与C机制编译后,也就在汇编语言阶段,函数名的不同:
时常在cpp的代码之中看到这样的代码:
de>#ifdef __cplusplus
extern
“C
” {
#endif
//一段代码
#ifdef __cplusplus
}
#endif de>
这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码
的含义是:如果这是一段cpp的代码,那么加入extern
“C
“{
和}

理其中的代码。
要明白为何使用extern
“C
“,还得从cpp中对函数的重载处理开始说起。
在c
++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而
在C
中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C
++和C

产生的函数名字的处理是不一样的.
比如下面的一段简单的函数,我们看看加入和不加入extern
“C
“产生的汇编
代码都有哪些变化:
de>int f(void)
{
return 1;
} de>
在加入extern
“C
“的时候,也就是以c的方式产生函数名,产生的汇编代码
是:
de>.file “test.cxx”
.text
.align 2
.globl _f
.def _f; .scl 2; .type 32; .endef
_f:
pushl %ebp
movl %esp, %ebp
movl $1, %eax
popl %ebp
ret de>
但是不加入了extern
“C
“之后,也就是以c++的方式产生函数名,产生的
汇编代码是:
de>.file “test.cxx”
.text
.align 2
.globl __Z1fv
.def __Z1fv; .scl 2; .type 32; .endef
__Z1fv:
pushl %ebp
movl %esp, %ebp
movl $1, %eax
popl %ebp
ret de>
两段汇编代码同样都是使用gcc
-S命令产生的,所有的地方都是一样的,唯独是产生的函数名,一个是_f,一个是__Z1fv。由于C++具有函数名重载功能,所以在编译阶段在函数名前
加点花@或者其他字符,这样可以保证重载的正确性。
二、实例分析:
明白了加入与不加入extern
“C
&ldqu


相关文档:

Java与C通信要注意的几个问题

1.大尾(big_endian)小尾(little_endian)的问题
基于Web的测试软件是由C++数据采集服务器程序和客户端Java显示程序两部分构成,前者用C++,后者Java语言,存在数据移植问题。因为
在计算机系统中,当包含数字的二进制文件从一个结构移到另一结构时,就出现大尾小尾问题。不同CPU在多字节数(如四字节int)存储时有两种方法 ......

在vc.net中的C/C++代码生成DLL步骤


1 选择new->project->win32 console project;
    在这一步的选框上有一个选项是 create dictionary for solution, 我不知道这个具体是什么作用,选了之后会项目出现两层文件夹,比如你创建一个命名为test的项目,会生成test文件夹,test中包含另一个test文件夹,你的项目实际上放在了内层te ......

C/C++文件操作[转载]

掌握文本文件读写的方法
了解二进制文件的读写方法
C++文件流:
fstream  // 文件流
ifstream  // 输入文件流
ofstream  // 输出文件流
//创建一个文本文件并写入信息
//同向屏幕上输出信息一样将信息输出至文件
#include<iomanip.h>
#include<fstream.h>
void main()
{
  ofstream f1("d:\\ ......

搭建eclipse下的c和c++开发环境


 
我们需要一个cdt,这个可以在Eclipse官网下载。
我们需要MinGW——C/C++编译平台,下载后需要安装,同时选中g++、MinGW Make,同时设置环境变量,将%MinGW_HOME%\bin设置到PATH中,然后我们可以通过命令行敲击gcc,看是否有效果。
我们需要gdb——C/C++调试平台,下载后安装,默认到MinGW_ ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号