Почему этот код не компилируется и не запускается в Visual Studio 2010?

#c #visual-studio-2010 #ansi

#c #visual-studio-2010 #ansi-c

Вопрос:

Я пытаюсь настроить Visual Studio 2010 на выполнение обычной компиляции ANSI без каких-либо расширений Microsoft.

Я начал с пустого шаблона проекта, поскольку, похоже, простого шаблона проекта ANSI в 2010 больше не существует.

Затем я устанавливаю

Свойства -> Свойства конфигурации -> 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 "Releaseansi_test.unsuccessfulbuild".
1>ClCompile:
1>  Main.cpp
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludeostream(636): error C3861: 'width': identifier not found
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludeostream(636): error C3861: 'width': identifier not found
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludeostream(639): error C3861: 'flags': identifier not found
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludeostream(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.0VCincludeostream(643): error C2780: 'void std::fill(_FwdIt,_FwdIt,const _Ty amp;)' : expects 3 arguments - 0 provided
1>          C:Program Files (x86)Microsoft Visual Studio 10.0VCincludexutility(2712) : see declaration of 'std::fill'
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludeostream(643): error C3861: 'rdbuf': identifier not found
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludeostream(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.0VCincludeostream(648): error C3861: 'rdbuf': identifier not found
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludeostream(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.0VCincludeostream(654): error C2780: 'void std::fill(_FwdIt,_FwdIt,const _Ty amp;)' : expects 3 arguments - 0 provided
1>          C:Program Files (x86)Microsoft Visual Studio 10.0VCincludexutility(2712) : see declaration of 'std::fill'
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludeostream(654): error C3861: 'rdbuf': identifier not found
1>C:Program Files (x86)Microsoft Visual Studio 10.0VCincludeostream(659): error C3861: 'width': identifier not found
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.63
  

Как мне заставить этот, самый базовый из C -кодов, скомпилироваться чисто?

Комментарии:

1. Я только что попробовал — никаких проблем.

2. почему каждый второй вопрос о соответствии ANSI рекомендует /Za , если он нарушен?

3. Вот ссылка на сообщение от сотрудника MS, ответственного за стандартную библиотеку. Он отказался от использования /Za…

4. если я удалю, /Za он компилируется и запускается, но /Wall выдает кучу дерьмовых предупреждений, я бы подумал, что что-то такое простое должно скомпилироваться чисто?

5. Microsoft должна исправить MSVC, чтобы он выполнял то же, что и GCC, и не выдавал диагностику системных заголовков (даже для высоких уровней предупреждения) — что пользователь должен с этим делать?

Ответ №1:

Ошибка исчезает, если вы определяете wchar_t как собственный тип.

Комментарии:

1. Я могу воспроизвести это. Я думаю, что этот параметр используется по умолчанию, поэтому он должен компилироваться при чистой установке.

2. У меня это было отключено, я снова включил его, и моя программа компилируется и запускается сейчас. /Za Опция не была проблемой, я установил ее снова, и все по-прежнему работает.

Ответ №2:

Если я скопирую ваш код в файл, test.cpp а затем выполните команду

 cl /Za /EHsc test.cpp
  

затем он компилируется чисто без каких-либо предупреждений или ошибок при моей установке Visual c express 2010. / EHsc необходим для правильной обработки исключений, и я действительно не понимаю, почему это не используется по умолчанию.

Отличается ли это от того, что вы делаете?

Комментарии:

1. Я нажимаю, CTRL-F7 чтобы скомпилировать main.cpp файл

2. cl /Za /Zc:wchar_t- test.cpp приведет к этим ошибкам. Похоже, что /Za и /Zc:wchar_t- несовместимы с VS2010.