写了个小小的 vc-fix

我们的 C++ 老师给我布置了 C++ 的大作业来替代其他同学交的无聊题目。大作业的第一题就是完整的高精度库,并且要求使用运算符重载。因为原来用 C 写过,这次写,思路上没有太大问题,不过全部程序被我 C++ 化了,代码看过去很诡异……呃……

我自己的机子上,自然使用 g++ 编译,不过我猜老师会要求 VC6 能够编译……我就用上次安装的 VC6 编译了一下,发现好几个错误和无数警告……其实也是我意料之中的。

其中我觉得最讨厌的莫过于 for 循环的循环变量不被视为 for 循环的局部变量这一点,导致大量变量被其认为是重复定义,这个是 VC6 和标准就语言上相去最远的问题了……不想每个都去改,麻烦死了。

在网上一找,还真找到一个简单的方法:

#define for if(0) ; else for

其实我也不知道这个是什么机理,不过真的很管用!

另外一个就是 VC6 的标准库中没有 maxmin 函数,这个也很囧,于是也自己写了一个。

以前做网页的时候经常写 ie-fix.css 文件,今天我弄 VC6 遇到这些问题,于是我也写了个 vc-fix.h 文件。M$ 真是一个需要 fix 的公司,什么时候出一个 m$-fix.com 好了……

最后贴出我的 vc-fix.h,主要解决 VC6 下 for 循环变量的问题和 maxmin 函数未定义的问题:

#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 太过了点……

参考资料:

Comments !

social