6

最近我面临着指向 VC6 编译器的问题。

其中很少有:

  1. 功能尝试块不起作用。相关问
  2. 类内常量不起作用。
  3. __FUNCTION_(获取函数名的宏)不起作用
  4. 最新添加的是它不允许将 void 函数作为 for_each 的一部分传递。

以下示例未使用 VC6 编译器进行编译。它说“错误C2562:'()':'void'函数返回一个值”。看起来 VC6 不喜欢将 void 函数传递给 for_each。

class Temp
{
public:
    Temp(int i):m_ii(i)
    {}

    int getI() const
    {
        return m_ii;
    }

    void printWithVoid()
    {
        cout<< "i = "<<m_ii<<endl;

    }
    bool printWithBool()
    {
        cout<< "i = "<<m_ii<<endl;
        return true;
    }
private:
    int m_ii;
};

int main(void) 
{
    std::vector<Temp>  arrTempObjects;

    arrTempObjects.push_back(Temp(0));
    arrTempObjects.push_back(Temp(2));

    //Doesnot work, compiler error 
    std::for_each(arrTempObjects.begin(), arrTempObjects.end(), std::mem_fun_ref(&Temp::printWithVoid));

    //Works
    std::for_each(arrTempObjects.begin(), arrTempObjects.end(), std::mem_fun_ref(&Temp::printWithBool));

    return 0;
}

您是否遇到过与 VC6.0 相关的任何其他问题。有什么办法可以解决这些问题?或者是时候改变编译器了?

4

12 回答 12

37

坦率地说,我很难理解您为什么不购买现代计算机并切换到 Visual Studio 2008。

VC6 的 STL 存在缺陷、C++ 标准合规性差以及 GUI 过时。

你不应该让你的竞争对手使用比你更好的工具。

于 2009-04-09T09:32:27.327 回答
7

好吧,事情就是这样。VC6 编译器很烂。但是... IDE 相当不错。

VS2005 有更好的源代码控制支持。否则,它的调试速度要慢得多,有一个糟糕的输出窗格,在插入输出行时会呈指数衰减(那是什么绝对的垃圾编码?),帮助系统慢很多倍,并且调试和继续(可能是微软优于其他 IDE 的最佳功能)破碎得多。

。网?当然,VS20xx 是唯一的出路。然而,对于一个坚持使用 VC6/MFC(用于嵌入式系统接口等)的小型客户端,我实际上很喜欢使用 VC6。这只是快速。

2008 年?我想...但是我的客户需要一段时间才能迁移。还没有人有。

于 2009-04-15T12:31:08.520 回答
6

是时候告别 VC6 编译器了吗?

是的。

于 2009-04-15T12:33:06.737 回答
3

不费吹灰之力的答案是肯定的,并且尽快。如果成本有问题,您有免费的替代品,如 VC++ express 和 Code::Blocks。解决兼容性问题的痛苦是 IMO 没有理由不升级,因为无论如何你总有一天必须这样做,而且只会变得更难。

我看到可能存在障碍的唯一原因是,如果您的 MFC 代码移植起来很困难/耗时。在这种情况下,您不能使用 VC++ express(不支持 MFC)并且您必须至少为 VS std 进行投资。版。这将花费您大约 300 欧元(取决于您居住的地方)。

于 2009-04-09T10:00:30.847 回答
3

VC6 不能做任何类型的现代 C++。我记得我很久以前就尝试过使用其中一个 boost 库,比如可能是 Graph,它在整个地方都给出了“内部编译器错误”,所以最终我把它扔了进去。

于 2009-04-09T09:33:46.947 回答
2

几个月前,我使用 g++ 从 VC++ 6.0 更改为 Code::Blocks(即 FOSS),并且还没有真正回头。我有点想念 VC++ 调试器,因为 CB 中的 gdb 实现远没有那么流畅,但仅此而已。IDE 中的某些东西工作得更好(代码完成、工具提示、依赖关系计算),编译器显然要好得多。

关于您的观点,函数 try 块几乎不是一个广泛使用的功能,而且大多数人认为它们毫无用处。而且__FUNCTION__宏不是 C++ 标准的一部分,所以如果可移植性是一个问题,你不应该过分依赖它。

于 2009-04-09T09:41:14.980 回答
2

不,十年前是时候告别它了。以下是几个原因:

  • Microsoft 和其他公司提供免费的、符合标准的编译器
  • VC6 是在 C++ 语言标准化之前编写的,它远不符合标准。特别是模板和标准库生活在自己的世界中,与这些功能在 ISO C++ 中的实际工作方式无关。它编译的语言不是 C++。它是预标准 C++、Microsoft 扩展、编译器限制和错误的混合体。这两者都不是可取的。
  • 众所周知,VC6 在某些情况下会生成无效代码。它不仅编译了一种自制的、有缺陷的和非标准的语言,它还进行了无效的优化,导致崩溃,或者在某些情况下实际上产生了根本无法执行的错误程序集。

它坏了,而且它总是坏的。它旨在编译一种语言,该语言在编译器发布时(当语言标准化时)几乎在同一时间停止存在,即使在该任务中它也失败了,存在无数错误,其中一些已在六个中修复已发布的服务包。但不是全部,甚至不是所有关键的。

当然,这样做的缺点是您的应用程序很可能同样损坏。(不是因为你是糟糕的程序员,而是因为它针对一个损坏的编译器。它必须被损坏才能被 VC6 接受)

将其移植到符合标准的编译器可能需要做很多工作。不要以为您可以只导入旧项目,单击“构建”,它就会起作用。

因此,如果您是一家大企业的一员,不能只花一个月的时间来切换编译器,那么您可能必须将其作为一个副项目移植,而团队的一部分人正在维护 VC6 版本。在成功移植所有内容并且它可以工作之前,不要废弃 VC6。

于 2009-05-27T14:00:06.190 回答
1

我想这就是为什么 Windows 上有这么多应用程序很糟糕的原因,因为人们仍然使用 VC6。当 wxWidgets 和 Qt4 比 MFC 好得多时,为什么还要搞砸、从未维护过的 MFC 甚至 Win32,而且您甚至可以使用 Visual Studio 2005+ 的免费附加功能

于 2009-04-21T10:16:38.197 回答
1

你可以学会忍受 VC6s 的缺点。如今,它几乎具有一定的复古魅力。多年来,我们一直在反复向客户提供一些库的“最后一个 VC6 版本”。很难与准备为反向移植和维护分支机构的额外工作付费的客户争论。但在某些时候,我们向后移植在较新 VC 中开发的新功能的成本将超过它们最终升级的成本(尤其是在更多的提升和英特尔 TBB 悄悄进入代码库的情况下)。或者至少我希望这会发生!在最坏的情况下,它会在出现片状 C++0x 支持时发生,我们将在 10 年内一直为他们提供支持......

于 2009-04-09T12:38:52.277 回答
1

除非你有一个大程序要维护,否则是的。今天换!

VC++ 的 Express 版本可从 Microsoft 免费下载。

于 2009-04-09T09:49:54.303 回答
0

一般规则似乎是新版本是升级,因此是值得的。

然而!您必须为它选择正确的时间,修复了很多错误,但是您需要了解标准的新错误和变体。

留出时间进行升级。升级编译器版本本身很可能是一个项目,请确保在升级之前拥有稳定的代码和良好的测试,并在完成后证明它仍然可以正常工作。

当您开始为 Vista 开发时,您可能会被迫升级,因为 VC6 不能轻松提供代码签名,并且 redist 不是 Vista 喜欢的形式。(至少要VC2K5)

于 2009-04-09T13:33:11.833 回答
0

你会很快更新操作系统吗?当我研究将我们的应用程序迁移到 Vista 时,我发现 Vista 在 VS 2005 之前没有正式支持任何东西(VB 6 除外),并且有一页长的列表列出了 VS 2005 可能存在的小问题,这些问题可能会或可能不会咬你. 我建议推迟到 VS 2008 SP1 可用(即,当 VS 2008 真正可用时),并首先进行编译器转换。

如果该项目是为少数在旧 NT 机器上单独运行它的客户提供的特殊项目,您可能希望将其保持在 VS 6。如果您将其出售用于任何类型的一般消费,则需要将其设为 Vista-在某些时候兼容(或 7 兼容,或其他),您将需要升级。

于 2009-04-09T14:01:46.913 回答