使用纯 C++ 编译器与 Visual C++
Posted
技术标签:
【中文标题】使用纯 C++ 编译器与 Visual C++【英文标题】:Using a pure C++ compiler versus Visual C++ 【发布时间】:2009-10-16 00:56:13 【问题描述】:我四处寻找这些问题的答案,但运气不佳。所以,我想我会把它们贴在这里以获得一些澄清。如果这是重复的,请告诉我,我将关闭它。
好的,话虽如此,我想开始学习 C++。我来自 C# 背景,我非常尊重 Visual Studio 及其功能。现在,我的问题是。与非 Microsoft 版本(如 MinGW)相比,Visual Studio 的编译器在 C++ 上的工作情况如何?
我喜欢的是这个。我对 Microsoft 没有任何问题,但我真的很想以“纯”形式学习 C++,而不是被任何特定的实现所束缚。 Visual C++ 对 .NET Framework 的依赖程度如何?是否可以通过 Visual Studio 创建“纯”C++ 应用程序而无需任何 .NET 使用或开销? Visual Studio 编译器是像使用 C#/VB 一样将 C++ 编译成 CIL,还是像其他编译器一样一直编译?
感谢任何人提供的任何帮助!
【问题讨论】:
请注意,MinGW 作为基于 GCC 的编译器也有很多非标准选项。 【参考方案1】:Visual C++ 编译器会将 C++ 代码编译成与 .NET 框架无关的独立 EXE。
获得 .NET 包袱的唯一方法是将 C++ 编译为“托管”。
如果您创建一个新项目(文件|新建|新建项目)然后从项目类型中的 Visual C++ 子菜单中选择“Win32”并选择“Win32 控制台应用程序”,Visual Studio 将创建一个带有几个源代码的简单项目将编译成一个小的可执行文件。
大多数时候,Visual C++ 与其他编译器非常相似。避免使用#pragmas、微软库(MFC、ATL),你应该没问题。
编辑(感谢 Cheeso)-Documentation of where Visual C++ diverges from standard.
一般来说,我建议将 boost 库用于线程和网络,因为它们适用于许多平台(即 linux)。此外,如果您的代码可以在 GCC 和 Visual Studio 中编译,那么您在保持它的可移植性方面做得很好。
【讨论】:
感谢您的精彩回答。这就是我所希望的!另外,感谢所有回复的人! MS 记录了 VC++ 偏离 C++ 标准的地方。 msdn.microsoft.com/en-us/library/x84h5b78.aspx @Cheeso:这些只是“官方认可”的已知问题。实际上,还有更多。 @andreyT - 是的,唯一真正的解决方案是从一开始就使用两个编译器进行编译。【参考方案2】:最新版本的 VC++ 已明显更符合 C++ 标准,因此使用 Visual Studio 编写“纯”C++ 并不是真正的问题,假设您远离 Windows API、COM+ 和 ATL。事实上,Visual Studio 的文档非常丰富,详细介绍了标准库和 STL,因此可以帮助您学习很多东西。它不能教会你所有的东西,但它肯定装载了大量的信息,可以移植到任何编译器,并且在 IDE 中很容易访问。
【讨论】:
此外,调试器仍然是最好的调试器之一,特别是因为您可以将程序计数器(调试期间的小黄色箭头)拖放到任何地方,并且监视窗口会对您的语句进行非常复杂的评估类型。【参考方案3】:如果您创建一个新的解决方案,您应该选择新的 Win32 项目或 Win32 控制台应用程序,并选中“空项目”选项。然后您可以添加一个 main.cpp 文件,并添加您的标准 C++ 代码。
【讨论】:
【参考方案4】:如果您喜欢 Visual Studio,请继续使用它来学习 C++——我没有使用过最新版本,但即使是之前的版本也非常符合标准,符合 C++ 标准,我假设是最新版本只能变得更好。您可以在 Visual Studio 中拥有许多不同类型的项目,包括“控制台应用程序”,这是您可以在任何平台上制作的“普通”类型,以及许多其他类型,例如使用旧的 win32 api 的 Windows 应用程序,使用 MFC 或其他早于 .NET 的框架制作的,使用“托管代码”的 .NET 等。
只要确保您始终在“控制台应用程序”项目中工作,您的操作方式与您在其他平台和/或其他 C++ IDE 上的操作方式非常接近。
【讨论】:
【参考方案5】:如果您限制自己编写符合 ANSI C++ 的代码,那么您在 VS 中编写的内容将在其他编译器中工作,直到您必须与图形界面或 IO 交互。然后,您需要确定您使用的是可移植的东西,例如 OpenGL,而不是 DirectX。
要设置您的项目,此处的步骤可能很有用: http://bytes.com/topic/net/answers/447572-strict-ansi-c
【讨论】:
【参考方案6】:Microsoft Visual Studio 2005 带有一个非常好的、符合 C++98 标准的纯 C++ 编译器。如果您对纯 C++ 感兴趣,请不要忘记在项目设置中禁用语言扩展,一切顺利。没有人会强迫你使用 .NET 框架、MFC 或类似的东西。只是纯核心 C++ 语言和 C++ 标准库。
当然,就像任何其他编译器一样,它也知道不合规问题,但总的来说,它再次出奇地好。他们的编译器的旧版本(特别是 MS VS 6.0)存在许多不合规问题,甚至无法在禁用语言扩展的情况下编译自己的头文件。在 2005 版中,他们修复了很多此类问题。
【讨论】:
【参考方案7】:创建标准 Win32 项目后,您可以进一步提高合规性。在项目属性表上,有一个 C/C++ 类别,带有一个语言条目。这列出了 VC++ 可以 不同于标准的许多情况。在这里,您需要关闭语言扩展,并打开“wchar_t 作为内置类型”、“for-loop 一致性”和“RTTI 支持”。
【讨论】:
以上是关于使用纯 C++ 编译器与 Visual C++的主要内容,如果未能解决你的问题,请参考以下文章
将新的 MS C++ 编译器与旧的 Visual Studio 一起使用
强制包含可以与 Visual C++ 中的预编译头一起使用吗?
Visual C++ 编译器 2012 年 11 月 CTP 与 Qt Creator for C++11