我们的 C++ 老师给我布置了 C++ 的大作业来替代其他同学交的无聊题目。大作业的第一题就是完整的高精度库,并且要求使用运算符重载。因为原来用 C 写过,这次写,思路上没有太大问题,不过全部程序被我 C++ 化了,代码看过去很诡异……呃……
我自己的机子上,自然使用 g++ 编译,不过我猜老师会要求 VC6 能够编译……我就用上次安装的 VC6 编译了一下,发现好几个错误和无数警告……其实也是我意料之中的。
其中我觉得最讨厌的莫过于 for
循环的循环变量不被视为 for
循环的局部变量这一点,导致大量变量被其认为是重复定义,这个是 VC6 和标准就语言上相去最远的问题了……不想每个都去改,麻烦死了。
在网上一找,还真找到一个简单的方法:
#define for if(0) ; else for
其实我也不知道这个是什么机理,不过真的很管用!
另外一个就是 VC6 的标准库中没有 max
和 min
函数,这个也很囧,于是也自己写了一个。
以前做网页的时候经常写 ie-fix.css
文件,今天我弄 VC6 遇到这些问题,于是我也写了个 vc-fix.h
文件。M$ 真是一个需要 fix 的公司,什么时候出一个 m$-fix.com
好了……
最后贴出我的 vc-fix.h
,主要解决 VC6 下 for
循环变量的问题和 max
、min
函数未定义的问题:
#ifndef _H_UPSUPER_VC_FIX_
#define _H_UPSUPER_VC_FIX_
#ifdef _MSC_VER
# if _MSC_VER <= 1200
# define for if (0); else for
template <class T>
inline const T& max(const T& a, const T& b) {
return a > b ? a : b;
}
template <class T>
inline const T& min(const T& a, const T& b) {
return a < b ? a : b;
}
template <class T, class Compare>
inline const T& max(const T& a, const T& b, Compare comp) {
return comp(a, b) ? b : a;
}
template <class T, class Compare>
inline const T& min(const T& a, const T& b, Compare comp) {
return comp(a, b) ? a : b;
}
# endif
#endif
#endif // _H_UPSUPER_VC_FIX_
最后要解决的就是警告的问题。其实我很无语的是,所有的警告都是在 VC6 自己的头文件里面的……VC6 自己提示可以添加 /GX
来消除那些警告。于是我不得不再次修改我的编译脚本:
#!/bin/bash
# - * - coding: UTF-8 - * -
VC6_DIR="这里写上VC6的安装地址"
BIN="$VC6_DIR/VC98/Bin"
export INCLUDE="$VC6_DIR/VC98/Include"
export LIB="$VC6_DIR/VC98/Lib"
ARGS=
while getopts "o:cG:" optname
do
case "$optname" in
"o")
ARGS="$ARGS /o$OPTARG"
;;
"c")
ARGS="$ARGS /c"
;;
"G")
ARGS="$ARGS /G$OPTARG"
;;
esac
done
wine "$BIN/CL.EXE" $ARGS ${@:$OPTIND}
到了最后,再补充一点点吧。VC6 发现了两个额外的错误,我觉得应该不是不兼容的问题。就是我重载的 operator++
和 operator--
不小心忘记写 return *this;
了,g++ 没有给我任何提示的编译通过了,而 VC6 则将这个视为错误。
在这个问题上,我同意 VC6 的看法,虽然我怀疑可能 g++ 自己加上了那句话,不过我觉得这个应该至少给出一个警告而非什么都不说。当然,可能一个 fatal error 太过了点……
参考资料:
There are comments.