大家好,作为 C++ 的初级程序员,我正在研究编译器的一些差异,我为 gcc 编译器(代码块)和 Visual C++(Visual Studio Express)导入了相同的源文件,我发现了一些奇怪的行为没想到。
Visual C++ 抛出了一堆错误,在我看来这些错误非常大...比如使用不同的迭代器遍历 vector,迭代器来自另一个 vector 实例而不是使用此迭代器完成的操作.... gcc 编译成功并且在运行时没有抛出任何错误...而 visual c++ 在编译中抛出一堆错误然后抛出“不同迭代器类型”的运行时错误,或者使用 new char[str.length()+ 进行动态字符分配1] 和 strcpy_s() 从字符串到它们 - Visual C++ 调试器抛出损坏堆的运行时错误,而代码块调试器运行得很好。
我的问题是。这些编译器和调试器真的有这么大的区别吗?如果代码在 gcc 和代码块调试器中运行完全完美但在 visual studio 中抛出错误,我是否应该担心我的编程处于糟糕的水平?
我已经学会了在代码块中用 C++ 编程,visal C++ 向我展示了我完全没有意识到的错误..
最佳答案
问题出在您的代码上,而不是您的编译器或设置上。您所描述的问题类型是未定义行为的示例,这些行为是由相当糟糕的编程或编码技术引起的(事实上,如果不特意编写有缺陷的代码,其中一些很难实现)。
问题是,编译器不需要检测这些东西。他们是否这样做是编译器或库实现质量的关注点。在您的情况下,您的 VC++ 版本似乎检测到 g++ 没有检测到的问题,这是支持 VC++ 的一点。
我的经验实际上与此相反:我发现 g++ 比 VC++ 检测到更多问题。但是,VC++ 和 g++ 都可以诊断对方不能诊断的问题。
这一切都表明您的里程数会有所不同。就个人而言,我提倡在可能的情况下通过多个编译器提供我的所有代码 - 正是因为这扩大了诊断问题的范围。
然后我执行一项策略,确保我的代码在所有编译器中都能干净地编译(完全没有诊断,其中不包括警告),而不必禁用任何诊断,并避免使用任何旨在抑制编译器诊断的代码结构.
要意识到的一件事是,编译器在安装时通常配置为不产生许多诊断信息。这是有历史原因的。需要开启设置才能让编译器给出警告或错误。对于 g++,-Wall -pedantic
(可通过 Code::Blocks 启用)等命令选项确实会增加报告的问题数量。 VC++ 也有类似的选项(虽然我不记得它们了)。
关于C++ gcc 与 Visual C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29858861/