如何在C++中调用C的代码
以前曾经总结过一篇(http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html
),关于在
C
中如何调用
C++
的代码,当时并未做完全的展开,只是简单的做了下调试,最近看到一个题目要求实现
C
和
C++
中代码的互相调用,其结果虽然都是通过
extern “C”
来实现
,但是具体还是有些差别的。
先对
C
中调用
C++
代码作个简单回顾:
1、
对于
C++
中非类的成员函数,可以简单的在函数声明前面加
extern “C”
,通常函数声明位于头文件中,当然也可以将声明和函数定义一起放在
cpp
中
,在没有声明的情况下,直接在定义前添加
extern “C”
也可
2、
对于
C++
类的成员函数,则需要另外做一个
cpp
文件,将需要调用的函数进行包装
。
以上两项的实例参看前面
C
中如何调用
C++
代码的文章。
要实现
C++
中调用
C
的代码,具体操作:
对于
C
中的函数代码,要么将
C
代码的头文件进行修改,在其被含入
C++
代码时在声明中加入
extern “C”
或者在
C++
代码中重新声明一下
C
函数,重新声明时添加上
extern “C”
头
。
通过以上的说明,我明白一点,那就是加
extern “C”
头一定是加在
C++
的代码文件中才能起作用的
。
下面分析一下这个现象的实质原因:
C
编译器编译函数时不带函数的类型信息,只包含函数符号名字,如
C
编译器把函数
int a(float x)
编译成类似
_a
这样的符号,
C
连接器只要找到了调用函数的符号,就可以连接成功,它假设参数类型信息是正确的,这是
C
编译连接器的缺点。而
C++
编译器为了实现函数重载,编译时会带上函数的类型信息,如他把上面的
a
函数可能编译成
_a_float
这样的符号为了实现重载,注意它还是没有带返回值得信息,这也是为什么
C++
不支持采用函数返回值来区别函数重载的原因之一,当然,函数的使用者对函数返回值的处理方式(如忽略)也是重要原因。
基于以上,
C
调用
C++
,首先需要用封装函数把对
C++
的类等的调用封装成
C
函数以便
C
调用,于是
extern "C"
的作用是:让编译器知道这件事,然后以
C
语言的方式编译和连接封装函
相关文档:
【原型】
type fun( type arg1, type arg2, ...
);
【描述】
主要用在参数个数不确定的函数中,例如:printf函数。
【使用方法】
参考:glib/manual/Add.c
#include <stdarg.h>
#include <stdio.h>
int add_em_up (int coun ......
用c语言做了个通讯录,系统一运行时便将数据文件加载进内存,并用链表存储。退出系统时,自动将链表中的所有节点再存入文件。
可是现在,每次退出系统,文件里都会比链表多存储一条记录。
如:现在只有两条记录,退出后在启动时一查询,就会多一条乱记录(系统自己加的)。
加载文件的部分代码如下:
/*判断文件是否 ......
1.区别(主要的):指针需要增加一次额外的提取操作
编译器为每个变量分配一个地址(左值)。这个地址编译时可知,而且该变量在运行时一直保存于这个地址。相反,存储于变量中的值(它的右值)只有在运行时才可知。如果需要用到变量中存储的值,编译器就发出指令从地址读入变量值并将它存于寄存器中。
  ......
C/C++中Static的作用详述
1.先来介绍它的第一条也是最重要的一条:隐藏。
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c.
下面是a.c的内容:
char a = 'A'; // global variable
void ......
VC中下面几个结构体大小分别是多少呢
struct MyStruct
{
double m4;
char m1;
int m3;
};
struct MyStruct {
char m1;
double m4;
int m3;
};
#pragma pack(push)   ......