为啥这段代码不能在 Visual Studio 2010 中编译和运行?

Posted

技术标签:

【中文标题】为啥这段代码不能在 Visual Studio 2010 中编译和运行?【英文标题】:Why won't this code compile and run in Visual Studio 2010?为什么这段代码不能在 Visual Studio 2010 中编译和运行? 【发布时间】:2011-04-27 20:28:43 【问题描述】:

我正在尝试将 Visual Studio 2010 设置为执行普通的旧 ANSI 编译,而不需要任何类型的 Microsoft 扩展。

我从一个空的项目模板开始,因为 2010 年似乎不再有一个普通的 ANSI 项目模板。

然后我设置

属性 -> 配置属性 -> C/C++ -> 语言 -> 禁用扩展 = 是 (/Za)

这是我的代码:

#include <iostream>

int main( int argc, const char* argv[] )

  std::cout << "Hello World!";
  return 0;

以下是错误:

1>------ Build started: Project: ansi_test, Configuration: Release Win32 ------
1>Build started 4/27/2011 4:20:00 PM.
1>InitializeBuildStatus:
1>  Touching "Release\ansi_test.unsuccessfulbuild".
1>ClCompile:
1>  Main.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(636): error C3861: 'width': identifier not found
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(636): error C3861: 'width': identifier not found
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(639): error C3861: 'flags': identifier not found
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(643): error C2227: left of '->sputc' must point to class/struct/union/generic type
1>          type is ''unknown-type''
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(643): error C2780: 'void std::fill(_FwdIt,_FwdIt,const _Ty &)' : expects 3 arguments - 0 provided
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility(2712) : see declaration of 'std::fill'
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(643): error C3861: 'rdbuf': identifier not found
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(648): error C2227: left of '->sputc' must point to class/struct/union/generic type
1>          type is ''unknown-type''
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(648): error C3861: 'rdbuf': identifier not found
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(654): error C2227: left of '->sputc' must point to class/struct/union/generic type
1>          type is ''unknown-type''
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(654): error C2780: 'void std::fill(_FwdIt,_FwdIt,const _Ty &)' : expects 3 arguments - 0 provided
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility(2712) : see declaration of 'std::fill'
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(654): error C3861: 'rdbuf': identifier not found
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\ostream(659): error C3861: 'width': identifier not found
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.63

我怎样才能得到这个最基本的 C++ 代码来干净地编译?

【问题讨论】:

我刚刚试了一下 - 没问题。 为什么所有其他关于 ANSI 合规性的问题都建议 /Za 如果它坏了? 这是 link 发给 MS 负责标准库的人员的消息。他已经放弃使用 /Za... 如果我取出 /Za 它会编译并运行,但 /Wall 会发出大量警告,我认为这么简单的东西应该可以编译干净吗? Microsoft 应该修复 MSVC,使其与 GCC 相同,而不是对系统标头进行诊断(即使是高警告级别)——用户应该如何处理这些问题? 【参考方案1】:

如果你define wchar_t as native type,错误就会消失。

【讨论】:

我可以重现这个。我认为该设置是默认设置,因此它应该在全新安装时编译。 我禁用了它,我重新启用了它,我的程序现在编译并运行。 /Za 选项不是问题,我重新设置了它,一切仍然有效。【参考方案2】:

如果我将你的代码复制到一个文件中,test.cpp 然后发出命令

cl /Za /EHsc test.cpp

然后它在我安装的 Visual c++ express 2010 时编译干净,没有任何警告或错误。 /EHsc 是正确处理异常所必需的,我真的不明白为什么它不是默认设置。

这与你所做的不同吗?

【讨论】:

我正在按CTRL-F7 编译main.cpp 文件 cl /Za /Zc:wchar_t- test.cpp 会产生这些错误。看起来 /Za/Zc:wchar_t- 自 VS2010 以来不兼容。

以上是关于为啥这段代码不能在 Visual Studio 2010 中编译和运行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 Visual Studio 中禁用预编译头文件?

为啥 Visual Studio 不能在“不调试就启动”模式下打开文件?

c++ 函数模板的问题,请看代码,为啥去掉注释后,visual studio 2012会无法运行。

为啥我不能在没有安装Visual Studio的机器上运行调试版的.NET程序

为啥“if constexpr”不能与 Visual Studio 2017 15.3 一起编译?

为啥按值传递 string_view?为啥 Visual Studio 不能对此进行优化?