在进入到本文主题之前,有三个概念要先说明一下:
1、在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区;
2、全局/静态存储区中存放的是全局变量和静态变量;
3、全局/静态存储区中的变量在编译时已分配内存;
本文的主角是全局/静态存储区中的变量。这两天要实现一个回调函数,至于为何回调函数要写成static,这里就不介绍了,有很多这方面的文章。我本想用非static的方式去实现,结果在编译时出了问题。具体见下面例子:
1)类回调函数
class testclass1
{
public:
void fun1()
{
}
};
class testclass2
{
public:
testclass2()
{
mfun = &testclass1::fun1;//error
}
typedef void(*funCallback)();
private:
funCallback mfun;
};
编译时,毫无疑问的失败了。如前所述,testclass1类的成员函数指针内存并非在编译时分配。
2)全局函数回调函数
void fun1()
{
cout << "do something" << endl;
}
typedef void (*fncallback)();
class testclass0
{
public:
testclass0()
{
mfun = &fun1;//ok
}
private:
fncallback mfun;
};
编译通过,fun1函数指针在编译时分配内存。
3)全局函数、在cpp文件中定义类构造函数
oid fun1()
{
cout << "do something" << endl;
}
typedef void (*fncallback)();
class testclass0
{
public:
testclass0();
private:
fncallback mfun;
};
testclass0::testclass0()
{
testclass0::mfun = &fun1;//error
}
编译失败,编译器报testfun.obj : error LNK2005: "void __cdecl fun1(void)" (?fun1@@YAXXZ) 已经在 stdafx.obj 中定义
1>D:\OpenCV\Test\Debug\Test.exe : fatal error LNK1169: 找到一个或多个多重定义的符号错误。至今无解,有哪位大神明白原因,请多多指教!