由于C ++现在使用头文件,有时候一个头文件包含另一个头文件而您没有注意到它,因为代码可以使用一个编译器而不是另一个编译器编译,或者可能一个功能在一个编译器中实现但是不是其他的,所以,我想知道是否有方法让Visual Studio检查项目是否会以VS编译器和g ++编译?或者我只需要每次都使用两个编译器手动重新编译?如果我必须使用两个编译器重新编译,我如何使用visual studio自动执行该过程,以便我不必手动完成?
答案 0 :(得分:2)
gcc的开发周期比MS Visual Studio的开发周期快。因此,询问Visual Studio“我的代码是否可以通过g ++正确编译?”没有意义 - 它永远不会知道最新版本的gcc有哪些功能和错误修正。
此外,提出这样的问题毫无意义 - 如果你想知道“如果我做X会发生什么”,那就做X!
我想你真正想知道的是“我的#include
指令是否与C ++标准兼容?”。 MS Visual Studio只是一个实现 - 它不是一个可移植性检查工具。它尽力编译代码,并且正确地执行它,这本身就是一项很棒的任务(c ++很难编译)。
gcc是c ++的另一个实现,具有自己的头文件。实际上,根据我的经验,mingw c ++标题更“简约”,也就是说,它们尽可能不包括另一个。我的猜测是,他们尝试最小化不使用预编译头的系统的编译时间,而MS Visual Studio将预编译头视为一个基本功能。
因此,最好使用gcc / mingw作为“标准合规性”检查。
答案 1 :(得分:2)
VS2015支持clang编译器,它通常是三者中最兼容的编译器。您可以使用clang编译代码。
区分编译器和标准库实现不是一回事是很重要的。即,您可以将编译器与随附不同工具链的标准库混合使用。因此,使用clang进行编译不会发现标准库实现中出现差异的问题。
要做到这一点,您必须链接并提供您要链接的标准库实现的标头。默认情况下,Visual Studio链接到它自己的运行时并包含msvc运行时标头,您必须更改项目配置才能实现它,但它应该是可能的。然而,简单地使用目标平台自己的工具链编译它会少得多麻烦。