# включить iostream перед stdafx.h в C++

Я создал консольное приложение 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?

Возможный дубликат Какая польза от stdafx.h в Visual Studio?

Dean Seo 02.05.2018 13:03

Есть так много вопросов относительно предварительно скомпилированных заголовков на SO, что я не уверен, какой из них пометить как дубликат.

Algirdas Preidžius 02.05.2018 13:03

В моем проекте один из других разработчиков отключил предварительно скомпилированные заголовки и вдвое сократил время сборки.

Eljay 02.05.2018 13:06
stdafx.h связан с (специфичным для Microsoft) способом управления предварительно скомпилированными заголовками (хотя другие компиляторы используют аналогичные приемы). Включение чего-то до того, как это сбивает с толку, как компилятор обрабатывает предварительно скомпилированные заголовки, и, следовательно, влияет на то, как он компилирует содержимое в них. Если вы предпочитаете использовать предварительно скомпилированные заголовки, не используйте #include в исходном файле до stdafx.h. Если вы отключите предварительно скомпилированные заголовки, вам даже не понадобится #include "stdafx.h", если ваша программа не использует специфичные для Windows функции API, чего нет в вашем примере.
Peter 02.05.2018 13:09

@Eljay Это зависит от проекта .. Над проектом, над которым я работаю, полная перестройка занимает чуть больше 2 часов. Невозможно даже проверить, как предварительно скомпилированные заголовки влияют на производительность сборки, не потратив на это много времени.

Algirdas Preidžius 02.05.2018 13:13

@Eljay, в этом случае у вас, скорее всего, были неправильные заголовки, включенные в ваш прекомпилированный файл. Вы действительно выиграете только от заголовков, которые включены несколько раз.

UKMonkey 02.05.2018 13:15

@ AlgirdasPreidžius • у моего проекта меньше часа для полной перестройки и минут для инкрементальной сборки. Было 2 часа для полной перестройки и около 2 часов для инкрементальной сборки. Я полностью согласен с UKMonkey ... неправильные заголовки включены в предварительно скомпилированный набор заголовков. Мой проект мог бы быть улучшен с помощью тщательной Lakosification, хотя это руководство относится к середине 90-х. Опять же, мой проект конца 80-х.

Eljay 02.05.2018 13:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
399
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ответ на ваш вопрос можно найти, немного озадачивая, здесь.

stdafx.h включает предварительно скомпилированные заголовки. На основании указанной ошибки и обсуждения того, как Microsoft реализует предварительно скомпилированные заголовки, кажется, что компилятор просто начинает компиляцию с включения stdafx.h вперед. Поэтому, когда stdafx.h помещается после iostream, iostream не включается, что приводит к загадочной ошибке.

Другие вопросы по теме