先上代码示例。一共5个文件,Lib库4个文件TClass.h,TClass.cpp,TInclude.h,TInclude.cpp。 exe程序1个文件UseLib.cpp
TClass.h:
#ifndef TCLASS_H
#define TCLASS_H
class TClass
{
public:
TClass();
#include "TInclude.h"
};
void TT();
typedef void(*FuncP)();
extern FuncP g_p[128];
#endif
TClass.cpp
#include<stdio.h>
#include "TClass.h"
TClass::TClass()
{
printf("TClass\n");
}
void TClass::TInclude()
{
printf("TInclude\n");
g_p[0]();
}
extern void* pT;
FuncP g_p[128] = {0};
TInclude.h
#ifndef TINCLUDE_H
#define TINCLUDE_H
void TInclude();
#endif
TInclude.cpp
#include "TInclude.h"
#include "TClass.h"
#include<stdio.h>
class TTInclude
{
public:
TTInclude()
{
printf("TTInclude c\n");
g_p[0] = &TT;
}
};
static TTInclude tt;
void* pT = &tt;
void TT()
{
pT =pT;
printf("TT\n");
}
UseLib.cpp
#include "TClass.h"
#include<stdio.h>
void main()
{
TClass t;
t.TInclude();
}
容我卖个关子,这个程序运行后会如何呢?想想再看下面的答案。
*************************************************华丽答案在下面*****************************************************************************************
上面的程序有问题时肯定的。表现是没有在第一行打印出:
TTInclude c然后在打印
TInclude之后崩掉。因为g_p[0]没有被赋值。也就是最终结果是静态变量tt没有实例化。可以只要一动一下代码所在文件就可以解决该问题哦,而不用添删任何一行代码。就是把void TT函数的定义从TInclude.cpp一动到TClass.cpp。最后代码打印4行内容,正常运行哦。
这里的内部原理还需要深入的验证。