Я создал консольное приложение C++ в Visual Studio Community 2017. В проекте есть только файл main.cpp. Вот мой файл main.cpp:
#include <iostream>
#include "stdafx.h"
int main()
{
std::cout << "hello world!";
return 0;
}
Я получаю сообщение об ошибке компиляции, что cout не является членом std. Но если я включу iostream после stdafx.h, то есть
#include "stdafx.h"
#include <iostream>
int main()
{
std::cout << "hello world!";
return 0;
}
тогда он компилируется нормально. Так почему же не работает, когда я включаю iostream до stdafx.h?
Есть так много вопросов относительно предварительно скомпилированных заголовков на SO, что я не уверен, какой из них пометить как дубликат.
В моем проекте один из других разработчиков отключил предварительно скомпилированные заголовки и вдвое сократил время сборки.
stdafx.h
связан с (специфичным для Microsoft) способом управления предварительно скомпилированными заголовками (хотя другие компиляторы используют аналогичные приемы). Включение чего-то до того, как это сбивает с толку, как компилятор обрабатывает предварительно скомпилированные заголовки, и, следовательно, влияет на то, как он компилирует содержимое в них. Если вы предпочитаете использовать предварительно скомпилированные заголовки, не используйте #include
в исходном файле до stdafx.h
. Если вы отключите предварительно скомпилированные заголовки, вам даже не понадобится #include "stdafx.h"
, если ваша программа не использует специфичные для Windows функции API, чего нет в вашем примере.
@Eljay Это зависит от проекта .. Над проектом, над которым я работаю, полная перестройка занимает чуть больше 2 часов. Невозможно даже проверить, как предварительно скомпилированные заголовки влияют на производительность сборки, не потратив на это много времени.
@Eljay, в этом случае у вас, скорее всего, были неправильные заголовки, включенные в ваш прекомпилированный файл. Вы действительно выиграете только от заголовков, которые включены несколько раз.
@ AlgirdasPreidžius • у моего проекта меньше часа для полной перестройки и минут для инкрементальной сборки. Было 2 часа для полной перестройки и около 2 часов для инкрементальной сборки. Я полностью согласен с UKMonkey ... неправильные заголовки включены в предварительно скомпилированный набор заголовков. Мой проект мог бы быть улучшен с помощью тщательной Lakosification, хотя это руководство относится к середине 90-х. Опять же, мой проект конца 80-х.
Ответ на ваш вопрос можно найти, немного озадачивая, здесь.
stdafx.h включает предварительно скомпилированные заголовки. На основании указанной ошибки и обсуждения того, как Microsoft реализует предварительно скомпилированные заголовки, кажется, что компилятор просто начинает компиляцию с включения stdafx.h вперед. Поэтому, когда stdafx.h помещается после iostream, iostream не включается, что приводит к загадочной ошибке.
Возможный дубликат Какая польза от stdafx.h в Visual Studio?