c++调用c时回调函数的处理
在c++调用c程序时,回调函数是不能直接使用的,以c++调用c的Gtk函数为例, 比如,在g_idle_add (init, NULL);
这句话中,一旦idle就会调用函数init(), 这个init()还会对类的成员变量进行处理。
这时,假如把init()简单地定义为类的普通成员函数就会出现类型不匹配的错误,因为g_idle_add()要求它的第一个参数
是个普通的函数指针,而现在却会被编译为GtkScreen::init()函数指针,(假定我要写的类叫做GtkScreen)。
解决办法就是:
1. 在GtkScreen的头文件中将函数init()声明为static的。
2. 在类的实现文件(GtkScreen.cpp)中所有的函数之外定义一个静态的指向类的指针: static GtkScreen* pobject;
3. 在构造函数中对pobject赋值: pobjct = this; (实际上不必一定在构造函数中,只要是比调用语句早执行的地方就行)
4. 在要调用的函数(init)中, 所有类的成员变量前面都加上pobject->
就行啦。
同时要注意,在c++中include c的库文件, include 语句的前面要加上
#ifdef __cplusplus
extern "C" {
#endif
后面要加上
#ifdef __cplusplus
}
#endif
相关文档:
c变成的对象大多是共享内存中申请,比较少用malloc直接来申请,所以链表设计一般是下面2中结构:
对象 --> 对象 --> 对象
对象 -->链表对象-->对象 -->链表对象
(1)对于第一种,链表直接关联到对象本身,所以如果一个对象在消亡时,没有及时清理掉链表关系,则会导致链表掉链。
(2)链表对象本身是一 ......
为什么需要使用extern "C"呢?C++之父在设计C++之时,考虑到当时已经存在了大量的C代码,为了支持原来的C代码和已经写好C库,需要在C++中尽可能的支持C,而extern "C"就是其中的一个策略。
试想这样的情况:一个库文件已经用C写好了而且运行得很良好,这个时候我们需要使用这个库文件� ......
在C语言里,全局变量如果不初始化的话,默认为0,也就是说在全局空间里:
int x =0; 跟 int x; 的效果看起来是一样的。但其实这里面的差别很大,强烈建议大家所有的全局变量都要初始化,他们的主要差别如下:
编译器在编译的时候针对这两种情况会产生两种符号放在目标文件的符号表中,对于初始化的,叫强符号,未初始化的 ......
int main()
{
printf(&unix["\021%six\012\0"], (unix)["have"] + "fun" - 0x60);
}
gcc -S编译成汇编代码如下:
.file "test.c"
.section .rodata
.LC0:
&nbs ......
(一)
对文件操作时有时获得文件的大小时必要的.下面是获得其大小小的较简单方法.
#include<io.h> //C语言头文件
#include<iostream> //for system();
using namespace std;
int main()
{
int handle;
handle = open("test.txt", 0x0100); //open file for rea ......