编译期用代码检测类的某个成员函数是否存在+你绝对没有见过的奇怪问题.
以下代码我用来检测某个类是否有某个方法的,如果工作正常,是大有用处的。
注意这些代码并不需要用到windows的windows.h和c++的string,所以没有必要包含
#include <windows.h>
#include <string>
这两行。于是我试着先去掉 #include <windows.h> ,程序运行竟然不正常了!于是我又加上#include <windows.h> ,程序又恢复正常。我又试着去掉#include <string> ,程序又工作不正常了。然后我两个全部去掉,程序又工作正常。
于是我发现规律:要么两个全部包含,要么两个全部不包含,程序则工作正常。
如果只包含其中一个,那么程序工作不正常。
这是我见过的最奇怪的问题,因为,正常地来说,不管怎么样的代码,与两个毫不相关的头文件,去掉或者加上某个头文件没有什么关系吧。请各位C++同志发表一下意见,这是怎么回事,怎么解决这个问题。
以下是程序全部代码。
#include <iostream>
#include <Windows.h>
#include <string>
struct NullStruct;
typedef char TOne;
struct TTwo{ char x[2]; };
template <int m>
struct Param
{};
struct TestCls
{
void MemFun( Param <1> ){}
void MemFun( Param <2> ){}
void MemFun( Param <3> ){}
};
template <int m,class T,void (T::*)(Param <m> )>
struct Tester;
template <int m,class T>
TOne Find(Tester <m,T,&T::MemFun> *);
template <int m,class T>
TTwo Find(...);
template <int m,class T>
struct Finder
{
enum{found=(sizeof(Find <m,T> (0))==sizeof(TOne))};
};
int main(int argc,char* argv[])
{
std::cout < <Finder <1,TestCls > ::found < <std::endl;
std::cout < <Finder <2,TestCls > ::found < <std::endl;
return 0;
}
[解决办法]
好象没什么问题啊
你说的正常和不正常是什么意思
[解决办法]
试了一下,运行结果都一样的。
[解决办法]
升级到8
要有补丁那怎么推出新版啊
[解决办法]
我靠,调试了很长时间,发现空行也能影响编译结果,比如之前的代码,把#include部分修改如下:
#include <iostream>
#include <Windows.h>
#include <string>
//...以下省略
输出结果为
0
0
中间少一个空行,如:
#include <iostream>
#include <Windows.h>
#include <string>
//...以下省略
输出结果为
1
1
其他类似的细小改动也能影响结果,不继续调试了。
[解决办法]
VC7.X就不要提了,bug太多的版本,简直比VC6还不可用。
直接升级到VC8