Не компилируется после удаления #include "stdafx.h"

Рейтинг: 2Ответов: 2Опубликовано: 13.04.2015

Почему первый вариант записи в Microsoft Visual Studio компилирует:

#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << "Hello, world!" << std::endl;

    std::cin.get();
    return 0;
}

а второй (более простой) нет:

#include <iostream>
using namespace std;

int main ()
{
    cout << "Hello world!!!\n";
    return 0;
}

Компилятор выдает ошибку

1>c:\users\admin\documents\visual studio 2013\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp(4)‌​: warning C4627: '#include ': skipped when looking for precompiled header use

В чем отличие и с чем это связано?

Ответы

▲ 6Принят

Смотрите.

Стандартная проблема языков, унаследовавших модульность C в виде #include — дикое время компиляции. Это связано с тем, что компилятор не может просто так скомпилировать header-файлы «про запас»: ведь то, что находится во включающем .cpp-файле до #include, может кардинально повлиять на смысл текста! (Представьте себе, например, #define void int.) Поэтому бедному компилятору приходится раз за разом перечитывать и перекомпилировать один и тот же заголовок, а также всё, что он в себя рекурсивно включает (а это могут быть десятки тысяч файлов!)

Для борьбы с этим одно из средств — предкомпилированные заголовки. Какая-то часть заголовочных файлов предкомпилируется, но чтобы корректно включить её, необходимо, чтобы она шла в самом начале .cpp-файла. Видите, почему? Потому что иначе в нём может встретиться директива, полностью меняющая смысл заголовочных файлов!

В Visual Studio предкомпилированные заголовки реализованы по умолчанию при помощи stdafx.h. Поэтому компилятор требует, чтобы #include "stdafx.h" всегда шло первой строкой. Вы, впрочем, можете легко обойти это поведение, покопавшись в настройках проекта: можно изменить имя предкомпилируемого заголовка или полностью отказаться от них. (Учтите, что в последнем случае ваш проект, возможно, будет компилироваться медленнее.)


Короче: добавьте #include "stdafx.h", проблема, судя по всему, в нём. (Если бы вы привели сообщение об ошибке, было бы легче найти точную проблему.)

▲ 1

Для того, чтобы второй пример работал просто создавайте пустое консольное приложение в Visual Studio. Дело в том, что в студии есть различные шаблоны проектов и, если я не ошибаюсь, первый Ваш пример говорит о том, что вы создали Win32 проект, который, помимо всего прочего, включает и общий заголовок stdafx, необходимый для более быстрой компиляции(precompiled header) и сборки приложения в студии.