先上代码示例。一共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行内容,正常运行哦。
这里的内部原理还需要深入的验证。