0

我正在上课,其中一个期望是我们提交的源代码将在我们教授的计算机上编译。似乎有道理。我真的不想安装 Windows 或使用可视化。我的一位同学发帖说下面的代码可以解决问题。对此有什么想法吗?是否可以改进以更接近严格的 ANSI/ISO c++ 编译?

$ g++ -std=c++98 -Wall -Wextra -Werror main.cpp -o outputprogram

我的操作系统是 10.8.x g++ 是:

  i686-apple-darwin11-llvm-g++-4.2

而 gcc 是

 i686-apple-darwin11-llvm-gcc-4.2: 
4

1 回答 1

3

我应该如何在 Mac 上用 c++ 编译源代码,以确保它在 Windows Visual Studio 编译器中正确编译,同时遵守 ANSI/ISO

你真的不能那样做。不可能。编译器在不同地方的行为略有不同,有时会导致编译失败和/或程序行为略有不同。对于 Microsoft Compiler,它可以愉快地编译使 G++ 感到困惑的代码(通常是模板),反之亦然,即使您不考虑非标准函数和扩展也是如此。因此,测试编译器的唯一可靠方法是使用该编译器。

我个人在开发应该与 g++/cl.exe(cl.exe == microsoft 编译器)一起使用的代码时遇到的问题。

  1. 与 cl.exe 相比,g++ 非常慢,至少在 Windows 上是这样。(慢 2..5 倍)
  2. g++ 有时无法编译模板构造 cl.exe 进程就好了。
  3. cl.exe 无法处理非常大的字符串常量(与 g++ 相比)。
  4. cl.exe (VS2008 express) 在没有 BOM 的情况下无法检测 UTF8 编码。
  5. 将编码与 cl.exe 混合(当操作系统使用编码 A 时,源文件在编码 B 中,并且您想使用需要编码 C 的函数显示 wchar_t 字符串)是一场噩梦。
  6. C 标准库函数在 cl.exe/g++ 上有所不同。一个编译器可以具有另一个编译器中不存在的函数(其中一些没有某些字符串 *ncmp 函数),编译器可能具有另一个编译器中不存在的非标准函数(strcpy_s),并且某些函数的行为可能与某些参数不同(带有“%S”的 sprintf)
  7. 如果包含 windows.h,则将 -Wall 传递给 cl.exe 会产生数千条无害代码警告。这些警告无法修复。

可能还有更多,但这就是我现在能记住的。

我真的不想安装windows

您可以尝试使用Wine将 Microsoft Compiler 安装到 MacOS 上。我希望您无法使用 wine 安装Visual Studio IDE(您的里程可能会很谨慎),但您应该能够运行 Windows Driver Kit 附带的仅命令行的微软编译器。但是,要以这种方式使用编译器,您必须非常熟悉它,因此将 Windows 安装到虚拟机中可能会容易得多。

于 2013-06-30T07:26:21.037 回答