易截截图软件、单文件、免安装、纯绿色、仅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


相关文档:

entry point to c/c++ or Fortran MEX file

http://www.mathworks.com/access/helpdesk/help/techdoc/apiref/mexfunction.html
mexFunction (C and Fortran) -
Entry point to C/C++ or Fortran MEX-file
C Syntax
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs,
const mxArray *prhs[]);
Fortran
Syntax
subrouti ......

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

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

about pack and align for C/C++

http://msdn.microsoft.com/en-us/library/2e70t5y1(VS.80).aspx
#pragma
pack(  n  )
n : Valid values are 1, 2, 4, 8, and 16.the
alignment of a member will be on a boundary that is either a multiple of 
n
 or
a multiple of the size of the member
,
whichever is smaller.
......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号