C++ gcc 与 Visual C++

标签 c++ visual-studio-2010 visual-c++ gcc compiler-errors

大家好,作为 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/

相关文章:

c++ - 头文件与源文件中的外部函数

.net - 并行 visual studio 解决方案构建

c# - CefSharp - 没有复制快捷菜单项

c++ - 在代码中使用 STLport 库的主要原因是什么?

c++ - c 和 c++ 共享带有命名空间的 h 文件

c++ - Visual C++ 和 Allegro5 : cannot recognize objects from abstract class from header file

c++ - 为什么不能在没有可变参数的情况下在 lambda 内部转发参数?

visual-studio - 如何将VC++6.0项目升级到VS2010?

c++ - 打开错误文件的错误信息

c++ - 静态库单独使用没问题,但在被引用时会抛出错误