我记得上个学期给同学做作业的时候碰到了这个问题:
一个成员函数 DWORD CBinaryTree.Obtain(PVOID &pObject);
作用是从树里面找出具有同
pObject 相同的索引值的记录,并且利用 pObject 来返回,函数本身的返回值是出错代码。
我是在 bcb5 编写的,同学要求是 vc6。
我在程序中调用好像是这样的:
struct StorageModal;
typedef StorageModal* PStorageModal;
struct StorageModal
{
DWORD dwIndex;
DWORD dwAddition;
};
PStorageModal psmItem = new StorageModal;
psmItem->dwIndex = 126;
cout << SomeClass->Obtain(psmItem);
//Error point.
bcb 屁事没有。但是在 vc6,错误就出在上一行。我以为要求我来一个强制转换。
然后就改成了这样:
cout << SomeClass->Obtain(PVOID(psmItem));
//Error point.
结果照旧。
我暴走(我靠,同学明天就交作业,我今天死磕也要磕出来才行……)。
然后,我又改写:
PVOID tmpPtr = psmItem;
cout << SomeClass->Obtain(tmpPtr);
// Correct
结果就好了。
后来我更换了无数种编译器(symantec, watcom, lcc, meta),没有发现 ms 这么笨的。
简直错的毫无逻辑嘛。
还有,vc6 中的输入输出流似乎不能用这个东东定位输出位置。bcb 可以。
#ifdef __MSVC
void FASTCALL gotoxy(short x, short y)
{
COORD c;
c.X = x - 1;
c.Y = y - 1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
#endif
但是 vc 中的 *printf 可以接受定位。不知道是怎么回事,也没有深入研究。
另外,我记得好像 jjHou 似乎写过 c++ 编译器的比较,ms 支持最为糟糕。