1.C++ Java 和C 三种语言中static的差别:
C++中的static和Java中基本类似 但是C语言不同:
在C语言中,关键字static有三个明显的作用:
1在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
1在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
2.C++中线程函数中方访问成员变量的问题
C++中线程函数可以使用2中方法定义:
1)全局函数。如 UINT MyThread(LPVOID p)
2)类的静态成员函数。如 static UINT MyView::MyThread(LPVOID p)
1)全局函数。如 UINT MyThread(LPVOID p)
2)类的静态成员函数。如 static UINT MyView::MyThread(LPVOID p)
线程函数中方访问成员变量的问题 实现方式有不少
基本原理都是把静态函数做成一个适配器(adapter) 调用另外一个函数
如下面的代码:
class A
{
public:
A();
static UINT ThreadProc(LPVOID pParam);
protected:
UNIT Run(); //线程的真正实现类
}
UINT A::ThreadProc(LPVOID pParam) //静态函数做成一个适配器
{
A *pObj = (A*)pParam;
return pObj->Run();
}
UNIT Run()
{
while (1)
{
//.......
}
return 0;
}
创建线程时:
CWinThread *pThread = AfxBeginThread(ThreadProc, this);
{
public:
A();
static UINT ThreadProc(LPVOID pParam);
protected:
UNIT Run(); //线程的真正实现类
}
UINT A::ThreadProc(LPVOID pParam) //静态函数做成一个适配器
{
A *pObj = (A*)pParam;
return pObj->Run();
}
UNIT Run()
{
while (1)
{
//.......
}
return 0;
}
创建线程时:
CWinThread *pThread = AfxBeginThread(ThreadProc, this);