首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ gcc vs visual c++

C++ gcc vs visual c++
EN

Stack Overflow用户
提问于 2015-04-25 06:57:24
回答 3查看 10K关注 0票数 1

大家好,作为c++的入门程序员,我正在研究编译器的一些差异,我导入了相同的源文件,用于gcc编译器(代码块)和visual c++ (Visual studio速成版),我发现了一些我没有预料到的奇怪行为。

可视化的c++抛出了一堆错误,在我看来这是非常大的错误……就像用不同的迭代器迭代向量一样,迭代器来自向量的另一个实例,而不是这个迭代器所做的操作。gcc编译成功,在运行时没有抛出错误...虽然可视化c++在编译过程中抛出了一堆错误,然后抛出了“不同迭代器类型”的运行时错误,或者使用字符串中的新charstr.length()+1和strcpy_s()进行动态字符分配-但可视化c++调试器抛出了损坏堆的运行时错误,而代码块调试器运行得很好。

我的问题是。这些编译器和调试器真的有这么大的区别吗?我应该担心我的编程是在一个糟糕的水平上,如果代码完全完美地运行在gcc和代码块调试器,但抛出错误在visual studio?

我学会了在代码块中用c++编程,visal c++向我展示了我完全没有意识到的错误。

EN

回答 3

Stack Overflow用户

发布于 2015-04-25 07:32:36

问题出在您的代码上,而不是编译器或设置上。您描述的问题类型是由相当糟糕的编程或编码技术导致的未定义行为的示例(实际上,其中一些问题很难实现,除非您不遗余力地编写有缺陷的代码)。

问题是,编译器不需要检测这样的东西。它们是否这样做是编译器或库实现质量的问题。在您的情况下,您的VC++版本似乎正在检测到g++没有检测到的问题,这是有利于VC++的一点。

我的经验实际上正好相反:我发现g++比VC++检测到更多的问题。但是,VC++和g++都能诊断出对方不能诊断的问题。

这一切都只是为了表明你的里程会有所不同。就我个人而言,我提倡在可能的情况下通过多个编译器提供我的所有代码-这正是因为这扩大了诊断问题的范围。

然后,我执行了一项策略,确保我的代码可以用所有编译器干净地编译(根本没有诊断,也就是没有警告),而不必禁用任何诊断,并避免使用任何旨在抑制编译器诊断的代码构造。

要认识到的一件事是,编译器在安装后通常被配置为不会生成太多诊断信息。这是有历史原因的。有必要打开这些设置,使编译器发出警告或错误。对于g++,像-Wall -pedantic这样的命令选项(可以通过Code::Blocks启用)确实增加了报告的问题数量。VC++也有类似的选项(尽管我现在记不起来了)。

票数 4
EN

Stack Overflow用户

发布于 2015-04-25 07:08:56

MSVC为std::vector提供了“已检查迭代器”,这些迭代器可以执行许多有用的检查。您可以通过使用-D_GLIBCXX_DEBUG进行编译,在GCC中启用其中一些类型的检查。如果您希望始终对访问权限进行边界检查,则需要使用std::vector::at()。通常,出于性能原因,最好在循环之外确保边界检查,然后在循环中使用未经检查的迭代器或索引。

票数 2
EN

Stack Overflow用户

发布于 2015-04-25 07:09:04

GCC的标准库完全按照你所说的去做,包括bug和所有的东西。大多数情况下,它的行为与您预期的一样,而您并没有意识到bug就在那里。不要被程序似乎可以工作的事实所蒙蔽,它可能仍然有bug。

Visual Studio具有标准库的两个变体。在发布版本中,它的行为与GCC相同。它完全按照你的指示去做,bug和所有的一切。在Debug构建中,它会在后台添加大量代码来检测其中的一些错误,并会通知您,正如您所观察到的那样。把这些修好!请注意,其中一些,如“堆损坏”,意味着它检测到几秒钟前发生了一个bug,并不意味着bug处于释放/删除状态。您还应该转到项目属性,在C++/General中,确保将警告级别设置为Level3甚至Level4。这将在编译时揭示更多的bug。

编译器在这方面的差异并不是很大,除了在调试版本中,Visual Studio添加了大量的错误检查来查找错误。其他实现,以及发布版本中的Visual Studio,都不会不遗余力地帮助您找到bug。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29858861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档