昨天晚上遇到这问题的时候,改变下编译顺序偶尔能解决,今天做了个test的工程,改变编译顺序还是不行,在bcb下编译可以正常运行,下面就把代码贴上来,5个文件,是不是大家也遇到过这样的问题,都怎么解决的。// main.cpp#include <stdio.h>
#include <stdlib.h>
#include "opcode.h"
#include "handler.h"int main()
{
Handler h;
int cnt = 10;
while(cnt--)
{
int i = rand() % O_MAX;
h.process(i);
}
return 0;
}// handler.h#pragma onceclass Handler
{
public:
void process(int i);
void handleNull();
};//handler.cpp#include "handler.h"
#include "stdio.h"
#include "opcode.h"void Handler::process(int i)
{
const HandlerTableItem& item = handleTable[i];
(this->*item.handler)();
}void Handler::handleNull()
{
printf("handleNull\n");
}//opcode.h#pragma onceclass Handler;enum Opcode
{
O_NULL,
O_ENTER,
O_LEAVE,
O_MAX
};struct HandlerTableItem
{
void (Handler::*handler)();
};extern HandlerTableItem handleTable[O_MAX];//opcode.cpp#include "opcode.h"#include "handler.h"HandlerTableItem handleTable[O_MAX] =
{
&Handler::handleNull,
&Handler::handleNull,
&Handler::handleNull,
};
#include <stdlib.h>
#include "opcode.h"
#include "handler.h"int main()
{
Handler h;
int cnt = 10;
while(cnt--)
{
int i = rand() % O_MAX;
h.process(i);
}
return 0;
}// handler.h#pragma onceclass Handler
{
public:
void process(int i);
void handleNull();
};//handler.cpp#include "handler.h"
#include "stdio.h"
#include "opcode.h"void Handler::process(int i)
{
const HandlerTableItem& item = handleTable[i];
(this->*item.handler)();
}void Handler::handleNull()
{
printf("handleNull\n");
}//opcode.h#pragma onceclass Handler;enum Opcode
{
O_NULL,
O_ENTER,
O_LEAVE,
O_MAX
};struct HandlerTableItem
{
void (Handler::*handler)();
};extern HandlerTableItem handleTable[O_MAX];//opcode.cpp#include "opcode.h"#include "handler.h"HandlerTableItem handleTable[O_MAX] =
{
&Handler::handleNull,
&Handler::handleNull,
&Handler::handleNull,
};
h.process(i);
=========>
改成: int i = ((int) rand()) % O_MAX;
h.process(i);
正确的话,应该是能调用到handleNull的方法的,然后输出10次handleNull退出
HandlerTableItem handleTable[O_MAX] =
{
{&Handler::handleNull},
{&Handler::handleNull},
{&Handler::handleNull},
};
{
&Handler::handleNull,
&Handler::handleNull,
&Handler::handleNull,
};
void Handler::process(int i)
{
const HandlerTableItem& item = handleTable[i];
(this->*item.handler)();
}void Handler::handleNull()
{
printf("handleNull\n");
}