Include stdafx h ошибка как исправить

When I compiled this program (from C++ Programming Language 4th edition):

main.cpp

#include <stdafx.h>
#include <iostream>
#include <cmath>
#include "vector.h"
using namespace std;

double sqrt_sum(vector&);

int _tmain(int argc, _TCHAR* argv[])
{
    vector v(6);
    sqrt_sum(v);
    return 0;
}

double sqrt_sum(vector& v)
{
    double sum = 0;
    for (int i = 0; i != v.size(); ++i)
        sum += sqrt(v[i]);
    return sum;
}

vector.cpp

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

vector::vector(int s)
:elem{ new double[s] }, sz{ s }
{
}
double& vector::operator[](int i)
{
    return elem[i];
}
int vector::size()
{
    return sz;
}

vector.h

#include <stdafx.h>
class vector{
public:
    vector(int s);
    double& operator[](int i);
    int size();
private:
    double* elem;
    int sz;
};

It gave me these errors:

errors

I run it on Microsoft Visual Studio 2013, on Windows 7. How to fix it?

Sensei James's user avatar

asked Oct 12, 2014 at 21:28

Kulis's user avatar

1

You have to properly understand what is a “stdafx.h”, aka precompiled header. Other questions or Wikipedia will answer that. In many cases a precompiled header can be avoided, especially if your project is small and with few dependencies. In your case, as you probably started from a template project, it was used to include Windows.h only for the _TCHAR macro.

Then, precompiled header is usually a per-project file in Visual Studio world, so:

  1. Ensure you have the file “stdafx.h” in your project. If you don’t (e.g. you removed it) just create a new temporary project and copy the default one from there;
  2. Change the #include <stdafx.h> to #include "stdafx.h". It is supposed to be a project local file, not to be resolved in include directories.

Secondly: it’s inadvisable to include the precompiled header in your own headers, to not clutter namespace of other source that can use your code as a library, so completely remove its inclusion in vector.h.

answered Oct 12, 2014 at 21:42

ceztko's user avatar

ceztkoceztko

14.6k5 gold badges56 silver badges73 bronze badges

5

Just include windows.h instead of stdfax or create a clean project without template.

answered Oct 12, 2014 at 22:05

user3718058's user avatar

user3718058user3718058

2931 gold badge3 silver badges11 bronze badges

There are two solutions for it.

Solution number one:
1.Recreate the project. While creating a project ensure that precompiled header is checked(Application settings… *** Do not check empty project)

Solution Number two:
1.Create stdafx.h and stdafx.cpp in your project
2 Right click on project -> properties -> C/C++ -> Precompiled Headers
3.select precompiled header to create(/Yc)
4.Rebuild the solution

Drop me a message if you encounter any issue.

answered Jun 11, 2016 at 6:51

Dila Gurung's user avatar

Dila GurungDila Gurung

1,67821 silver badges25 bronze badges

1

You can fix this problem by adding “$(ProjectDir)” (or wherever the stdafx.h is) to list of directories under Project->Properties->Configuration Properties->C/C++->General->Additional Include Directories.

answered Sep 13, 2018 at 15:46

Sar's user avatar

SarSar

1151 silver badge6 bronze badges

Add #include "afxwin.h" in your source file. It will solve your issue.

Al Lelopath's user avatar

Al Lelopath

6,37913 gold badges81 silver badges139 bronze badges

answered Jun 29, 2015 at 10:29

Dila Gurung's user avatar

Dila GurungDila Gurung

1,67821 silver badges25 bronze badges

Just running through a Visual Studio Code tutorial and came across a similiar issue.

Replace #include "stdafx.h" with #include "pch.h" which is the updated name for the precompiled headers.

Marius's user avatar

Marius

1,5096 silver badges20 bronze badges

answered Dec 26, 2018 at 13:07

Robert Morel's user avatar

0 / 0 / 0

Регистрация: 29.12.2014

Сообщений: 7

1

13.01.2015, 16:41. Показов 22654. Ответов 7


Студворк — интернет-сервис помощи студентам

скажите пожалуйста как исправит эту ошибку

 Комментарий модератора 
Сообщения и тексты программ надо копировать в текст поста

Ошибка подключения stdafx.h

Ошибка подключения stdafx.h



0



117 / 114 / 65

Регистрация: 18.09.2014

Сообщений: 337

13.01.2015, 16:43

2

Хигмат, а он у вас вообще есть, этот файл?



0



Эксперт С++

8724 / 4304 / 958

Регистрация: 15.11.2014

Сообщений: 9,751

13.01.2015, 16:44

3

Удалить физически строку с подключением ненужного вам “предварительно скомпилированного заголовка”.

IDE генерирует файлы проекта с использованием/не использованием “предварительно скомпилированных заголовков” при создании проекта.

Если поставите галочку “использовать предварительно скомпилированный заголовок” – студия создаст для вас необходимый хэдэр, который будет необходимо подключать к каждому cpp файлу.

Но если такую галочку не ставить – то и не нужно пытаться цеплять несуществующий хэдэр.



0



0 / 0 / 0

Регистрация: 29.12.2014

Сообщений: 7

13.01.2015, 16:55

 [ТС]

4

??????

Добавлено через 1 минуту
как узнат есть или нет?

Добавлено через 44 секунды
как узнат есть или нет?



0



7507 / 6382 / 2904

Регистрация: 14.04.2014

Сообщений: 27,776

13.01.2015, 17:06

5

Пересоздай проект с параметрами по умолчанию и перенеси туда текст.



0



Модератор

Эксперт С++

13085 / 10362 / 6201

Регистрация: 18.12.2011

Сообщений: 27,714

13.01.2015, 17:21

6

Отключить заголовки, меню:
Проект->Свойства->Свойства конфигурации->С/С++
->предварительно скомпилированные заголовки->Не использовать



0



Хигмат

0 / 0 / 0

Регистрация: 29.12.2014

Сообщений: 7

13.01.2015, 17:29

 [ТС]

7

помогите переписать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "stdafx.h"
#include "math.h"
#include <iostream>
 
using namespace std;
 
 
int _tmain(int argc, _TCHAR* argv[])
 
{ 
int n, m; 
float y[100000], x0, dx, x; 
 
do
{
cout << "Vvedite |x0|<1:"; 
cin >> x0; 
}
while (fabs(x0)>= 1);
 
do
{
cout << "nVvedite m:"; 
cin >> m; 
}
while (m<= 0);
 
do
{
cout << "nVvedite shag dx:"; 
cin >> dx; 
}
while (dx<=0);
 
 
 
n = 0; 
 
 
for (x = x0; n <= m; x = x + dx) 
{ 
y[n] =fabs(1/(1+x*x));
cout << "nx="<<x; 
cout << "nm="<<n; 
cout << "nY[m]="<<y[n]; 
cout << endl;
n++; 
}
 
 
 
system("pause");
return 0;
 
}



0



zss

Модератор

Эксперт С++

13085 / 10362 / 6201

Регистрация: 18.12.2011

Сообщений: 27,714

13.01.2015, 17:36

8

Отключите заголовки, как я написал выше
и:

C++
1
2
3
4
5
6
7
8
#include <cmath>
#include <iostream>
using namespace std;
  
int main()
{ 
   int n, m; 
...



0



Время на прочтение
11 мин

Количество просмотров 315K

StdAfx.h, Precompiled headers
Статья рассчитана на людей, которые знакомятся со средой Visual Studio и пытаются компилировать в ней свои Си++-проекты. В незнакомой среде всё кажется странным и непонятным. Особенно новичков раздражает файл stdafx.h, из-за которого возникают странные ошибки во время компиляции. Очень часто всё заканчивается тем, что новичок долгое время везде старательно отключает Precompiled Headers. Чтобы помочь людям разобраться что к чему, и была написана эта статья.

Для чего нужны Precompiled Headers

Precompiled headers предназначены для ускорения сборки проектов. Обычно программисты начинают знакомиться с Visual C++, используя крошечные проекты. На них сложно заметить выигрыш от precompiled headers. Что с ними, что без них, на глаз программа компилируется одинаковое время. Это добавляет путаницы. Человек не видит для себя пользы от этого механизма и решает, что он для специфичных задач и ему никогда не понадобится. И иногда считает так многие годы.

На самом деле, precompiled headers весьма полезная технология. Пользу от него можно заметить, даже если в проекте всего несколько десятков файлов. Особенно выигрыш становится заметен, если используются такие тяжёлые библиотеки как boost.

Если посмотреть *.cpp файлы в проекте, то можно заметить, что во многие включаются одни и те-же наборы заголовочных файлы. Например, <vector>, <string>, <algorithm>. В свою очередь, эти файлы включают другие заголовочные файлы и так далее.

Всё это приводит к тому, что препроцессор в компиляторе вновь и вновь выполняет идентичную работу. Он должен читать одни и те же файлы, вставлять их друг в друга, выбирать #ifdef ветки и подставлять значения макросов. Происходит колоссальное дублирование одних и тех же операций.

Можно существенно сократить объем работы, которую должен проделать препроцессор при компиляции проекта. Идея в том, чтобы заранее препроцессировать группу файлов и затем просто подставлять готовый фрагмент текста.

На самом деле, делается ещё ряд шагов. Можно хранить не просто текст, а более обработанную информацию. Я не знаю, как именно устроено в Visual C++. Но, например, можно хранить текст уже разбитый на лексемы. Это ещё больше ускорит процесс компиляции.

Как работают Precompiled Headers

Файл, который содержит precompiled headers, имеет расширение “.pch”. Имя файла обычно совпадает с названием проекта. Естественно, это и другие используемые имена можно изменить в настройках. Файл может быть весьма большим и зависит от того, как много заголовочных файлов в нём раскрыто. Например, в проекте PVS-Studio он занимает около 3 мегабайт.

Файл *.pch возникает после компиляции stdafx.cpp. Файл собирается с ключом “/Yc”. Этот ключ как раз и говорит компилятору, что нужно создать precompiled headers. Файл stdafx.cpp может содержать одну строчку: #include «stdafx.h».

В файле «stdafx.h» находится самое интересное. Сюда нужно включить заголовочные файлы, которые будут заранее препроцессироваться. В качестве примера, вот файл stdafx.h, используемый нами в PVS-Studio (файл сокращён для статьи):

#include "VivaCore/VivaPortSupport.h"
//For /Wall
#pragma warning(push)
#pragma warning(disable : 4820)
#pragma warning(disable : 4619)
#pragma warning(disable : 4548)
#pragma warning(disable : 4668)
#pragma warning(disable : 4365)
#pragma warning(disable : 4710)
#pragma warning(disable : 4371)
#pragma warning(disable : 4826)
#pragma warning(disable : 4061)
#pragma warning(disable : 4640)
#include <stdio.h>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <set>
#include <map>
#include <list>
#include <deque>
#include <memory>
#pragma warning(pop) //For /Wall

Директивы “#pragma warning” нам нужны, чтобы избавиться от предупреждений, выдаваемых на стандартные библиотеки.

Теперь во все файлы *.c/*.cpp следует включить «stdafx.h». Заодно стоит удалить из этих файлов заголовки, которые уже включаются с помощью «stdafx.h».

А что делать, если используются хотя и похожие, но разные наборы заголовочных файлов? Например, такие:

  • Файл A: <vector>, <string>
  • Файл B: <vector>, <algorithm>
  • Файл C: <string>, <algorithm>

Нужно делать отдельные precompiled headers? Так сделать можно, но не нужно.

Достаточно сделать один precompiled header, в котором будут раскрыты <vector>, <string> и <algorithm>. Выигрыш от того, что при препроцессировании не надо читать множество файлов и вставлять их друг друга намного больше, чем потери на синтаксический анализ лишних фрагментов кода.

Как использовать Precompiled Headers

При создании нового проекта Wizard в Visual Studio создаёт два файла: stdafx.h и stdafx.cpp. Именно с помощью них и реализуется механизм precompiled headers.

На самом деле, эти файлы могут называться, как угодно. Важно не название, а параметры компиляции в настройках проекта.

В *.c/*.cpp файле можно использовать только один precompiled header. Однако, в одном проекте может присутствовать несколько разных precompiled headers. Пока будем считать, что он у нас только один.

Итак, если вы воспользовались wizard-ом, то у вас уже есть файлы stdafx.h и stdafx.cpp. Плюс выставлены все необходимые ключи компиляции.

Если в проекте не использовался механизм precompiled headers, то давайте рассмотрим, как его включить. Предлагаю следующую последовательность действий:

  1. Во всех конфигурациях для всех *.c/*.cpp файлов включаем использование precompiled headers. Это делается на вкладке «Precompiled Header»:
    1. Выставляем для параметра «Precompiled Header» значение «Use (/Yu)».
    2. Для параметра «Precompiled Header File» указываем «stdafx.h».
    3. Для параметра «Precompiled Header Output File» указываем “$(IntDir)$(TargetName).pch”.
  2. Создаём и добавляем в проект файл stdafx.h. В дальнейшем, в него мы будем включать те заголовочные файлы, которые хотим заранее препроцессировать.
  3. Создаём и добавляем в проект файл stdafx.cpp. В нём одна единственная строка: #include «stdafx.h».
  4. Во всех конфигурациях меняем настройки для файла stdafx.cpp. Выставляем для параметра «Precompiled Header» значение «Create (/Yc)».

Вот мы и включили механизм precompiled headers. Теперь, если мы запустим компиляцию, то будет создан *.pch файл. Однако, затем компиляция остановится из-за ошибок.

Для всех *.c/*.cpp файлов мы указали, что они должны использовать precompiled headers. Этого мало. Теперь в каждый из файлов нужно добавить #include «stdafx.h».

Заголовочный файл «stdafx.h» должен включаться в *.c/*.cpp файл самым первым. Обязательно! Иначе всё равно возникнут ошибки компиляции.

Если подумать, в этом есть логика. Когда файл «stdafx.h» находится в самом начале, то можно подставить уже препроцессированный текст. Этот текст всегда одинаков и ни от чего не зависит.

Представьте ситуацию, если бы мы могли включить до «stdafx.h» ещё какой-то файл. А в этом файле возьмём и напишем: #define bool char. Возникает неоднозначность. Мы меняем содержимое всех файлов, в которых упоминается «bool». Теперь просто так нельзя взять и подставить заранее препроцессированный текст. Ломается весь механизм «precompiled headers». Думаю, это одна из причин, почему «stdafx.h» должен быть расположен в начале. Возможно, есть и другие.

Life hack

Прописывать #include «stdafx.h» во все *.c/*.cpp файлы достаточно утомительно и не интересно. Дополнительно получится ревизия в системе контроля версий, где будет изменено огромное количество файлов. Нехорошо.

Ещё одно неудобство вызывают сторонние библиотеки, включаемые в проект в виде файлов с кодом. Править эти файлы нет смыла. По правильному для них нужно отключить использование «precompiled headers». Однако, если используется несколько мелких сторонних библиотек, это неудобно. Программист постоянно спотыкается об precompiled headers.

Есть вариант, как использовать precompiled headers легко и просто. Способ подойдёт не везде и всегда, но мне он часто помогал.

Можно не прописывать во все файлы #include «stdafx.h», а воспользоваться механизмом «Forced Included File».

Идём на вкладку настроек «Advanced». Выбираем все конфигурации. В поле «Forced Included File» пишем:

StdAfx.h;%(ForcedIncludeFiles)

Теперь «stdafx.h» автоматически будет включаться в начало ВСЕХ компилируемых файлов. PROFIT!

Больше не потребуется писать #include «stdafx.h» в начале всех *.c/*.cpp файлов. Компилятор сделает это сам.

Что включать в stdafx.h

Это очень важный момент. Бездумное включение в «stdafx.h» всего подряд не только не ускорит компиляцию, но и наоборот замедлит её.

Все файлы, включающие «stdafx.h», зависят от его содержимого. Пусть в «stdafx.h» включен файл «X.h». Если вы поменяете хоть что-то в «X.h», это может повлечь полную перекомпиляцию всего проекта.

Правило. Включайте в «stdafx.h» только те файлы, которые никогда не изменяются или меняются ОЧЕНЬ редко. Хорошими кандидатами являются заголовочные файлы системных и сторонних библиотек.

Если включаете в «stdafx.h» собственные файлы из проекта, соблюдайте двойную бдительность. Включайте только те файлы, которые меняются очень-очень редко.

Если какой-то *.h файл меняется раз в месяц, это уже слишком часто. Как правило, редко удаётся сделать все правки в h-файле с первого раза. Обычно требуется 2-3 итерации. Согласитесь, 2-3 раза полностью перекомпилировать весь проект — занятие неприятное. Плюс полная перекомпиляция потребуется всем вашим коллегам.

Не увлекайтесь с неизменяемыми файлами. Включайте только то, что действительно часто используется. Нет смысла включать <set>, если это нужно только в двух местах. Там, где нужно, там и подключите этот заголовочный файл.

Несколько Precompiled Headers

Зачем в одном проекте может понадобиться несколько precompiled headers? Действительно, это нужно не часто. Но приведу пару примеров.

В проекте используются одновременно *.c и *.cpp файлы. Для них нельзя использовать единый *.pch файл. Компилятор выдаст ошибку.

Нужно создать два *.pch файла. Один должен получаться при компилировании C-файла (xx.c), а другой при компилировании C++-файла (yy.cpp). Соответственно, в настройках надо указать, чтобы в С-файлах использовался один precompiled header, а в С++-файлах — другой.

Примечание. Не забудьте указать разные имена для *.pch файлов. Иначе один файл будет перетирать другой.

Другая ситуация. Одна часть проекта использует одну большую библиотеку, а другая часть другую большую библиотеку.

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

Логично сделать два precompiled headers и использовать их в разных участках программы. Как уже отмечалось, можно задать произвольные имена файлов, из которых генерируются *.pch файлы. Да и имя *.pch файла тоже можно изменить. Всё это, конечно, требуется делать аккуратно, но ничего сложного в использовании двух precompiled headers нет.

Типовые ошибки при использовании Precompiled Headers

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

Fatal error C1083: Cannot open precompiled header file: ‘Debugproject.pch’: No such file or directory

Вы пытаетесь скомпилировать файл, который использует precompiled header. Но соответствующий *.pch файл отсутствует. Возможные причины:

  1. Файл stdafx.cpp не компилировался и, как следствие, *.pch файл ещё не создан. Такое может быть, если, например, в начале очистить проект (Clean Solution), а потом попробовать скомпилировать один *.cpp файл (Compile Ctrl-F7). Решение: скомпилируйте проект целиком или как минимум файл stdafx.cpp.
  2. В настройках ни указано ни одного файла, из которого должен генерироваться *.pch файл. Речь идёт о ключе компиляции /Yc. Как правило, такая ситуация возникает у начинающих, которые захотели использовать precompiled headers для своего проекта. Как это сделать описано выше в разделе «Как использовать Precompiled Headers».

Fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add ‘#include «stdafx.h»’ to your source?

Сообщение говорит само за себя, если его прочитать. Файл компилируется с ключом /Yu. Это значит, что следует использовать precompiled header. Но в файл не включён «stdafx.h».

Нужно вписать в файл #include «stdafx.h».

Если это невозможно, то следует не использовать precompiled header для этого *.c/*.cpp файла. Уберите ключ /Yu.

Fatal error C1853: ‘project.pch’ precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa)

В проекте присутствуют как C (*.c), так и C++ (*.cpp) файлы. Для них нельзя использовать единый precompiled header (*.pch файл).

Возможные решения:

  1. Отключить для всех Си-файлов использование precompiled headers. Как показывает практика, *.с файлы препроцессируются в несколько раз быстрее, чем *.cpp файлы. Если *.c файлов не очень много, то, отключив precompiled headers для них, вы ничего не потеряете
  2. Завести два precompiled headers. Первый должен создаваться из stdafx_cpp.cpp, stdafx_cpp.h. Второй из stdafx_c.c, stdafx_c.h. Соответственно, в *.c и *.cpp файлах следует использовать разные precompiled headers. Имена *.pch файлов естественно тоже должны различаться.

Из-за precompiled header компилятор глючит

Скорее всего, что-то сделано не так. Например, #include «stdafx.h» расположен не в самом начале.

Рассмотрим пример:

int A = 10;
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[]) {
  return A;
}

Этот код не скомпилируется. Компилятор выдаст на первый взгляд странное сообщение об ошибке:

error C2065: 'A' : undeclared identifier

Компилятор считает, что все, что указано до строчки #include «stdafx.h» (включительно), является precompiled header. При компиляции файла компилятор заменит все, что до #include «stdafx.h» на текст из *.pch файла. В результате теряется строчка «int A = 10».

Правильный вариант:

#include "stdafx.h"
int A = 10;
int _tmain(int argc, _TCHAR* argv[]) {
  return A;
}

Ещё пример:

#include "my.h"
#include "stdafx.h"

Содержимое файла «my.h» не будет использоваться. В результате, нельзя будет использовать функции, объявленные в этом файле. Такое поведение очень сбивает программистов с толку. Они «лечат» его полным отключением precompiled headers и потом рассказывают байки о глючности Visual C++. Запомните, компилятор — это один из наиболее редко глючащих инструментов. В 99.99% случаев надо не злиться на компилятор, а искать ошибку у себя (Proof).

Чтобы таких ситуаций не было, ВСЕГДА пишите #include «stdafx.h» в самом начале файла. Комментарии перед #include «stdafx.h» можно оставить. Они всё равно никак не участвуют в компиляции.

Ещё один вариант — используйте Forced Included File. См. выше раздел «Life hack».

Из-за precompiled headers проект постоянно перекомпилируется целиком

В stdafx.h включён файл, который регулярно редактируется. Или случайно включён автогенерируемый файл.

Внимательно проверьте содержимое файла «stdafx.h». В него должны входить только заголовочные файлы, которые не изменяются или изменяются крайне редко. Учтите, что включённые файлы могут не меняться, но внутри они ссылаются на другие изменяющиеся *.h файлы.

Творится что-то непонятное

Иногда может возникнуть ситуация, что вы поправили код, а ошибка не исчезает. Отладчик показывает непонятные вещи.

Причиной может быть *.pch файл. Как-то так получилось, что компилятор не замечает изменения в одном из заголовочных файлов и не перестраивает *.pch файл. В результате, подставляется старый код. Возможно, это происходило из-за каких-то сбоев, связанных с временем модификации файлов.

Это ОЧЕНЬ редкая ситуация. Но она возможна и про неё надо знать. Я за многие годы программирования сталкивался с ней только 2-3 раза. Помогает полная перекомпиляция проекта.

Проект, использующий precompiled headers не удаётся проверить с помощью PVS-Studio

Это наиболее частая ситуация, с которой к нам обращаются в поддержку. Подробности изложены в документации: “Устранение неисправностей при работе PVS-Studio”. Здесь опишу ситуацию кратко.

Если решение (solution) компилируется, это вовсе не значит, что оно правильно устроено. Часто одно решение (solution) содержит множество проектов. В каждом проекте используются свои precompiled headers (имеется свой stdafx.h и stdafx.cpp).

Возникают проблемы, когда начинают использовать файлы из соседнего проекта. Это удобно и так часто делается. Вот только забывают, что в *.cpp файле написано: #include «stdafx.h».

И, какой из stdafx.h подхватится, это интересный вопрос. Но раз программа компилируется — программисту везёт.

К сожалению, нам сложно повторить поведение, которое возникает при использовании *.pch файла. «Честный» препроцессор работает по-другому.

В том, что solution, на самом деле, устроен не верно, можно убедиться, временно отключив precompiled headers. Сразу может вылезти масса интересных ошибок, и программист будет искренне удивляться, каким же чудом компилировался его проект.

За подробностями вновь делаю отсылку к документации. Плюс, если что-то всё равно не ясно, мы подскажем в поддержке.

Заключение

Как вы увидели, ничего сложного в precompiled headers нет. Все «многочисленные глюки компилятора», с которыми сталкивается программист при их использовании, на самом деле, являются непониманием принципов работы. Надеюсь, эта статья поможет устранить непонимание.

Precompiled headers являются очень полезным механизмом, позволяющим существенно увеличить скорость компиляции проектов.

I am trying a test port of a VC++ project (ATL/WTL) from VC2005 to the 2010 release candidate.

On opening some of my source files in the code editor I noticed a large number of Intellisense red error “squiggles” the first of which is “Error Cannot open source file “StdAfx.h””. The rest of them seem to be due to missing pre-compiled header symbols
as would be expected. However dispite this the project builds and runs without any problem, so the compiler can find the precompiled header, but Intellisense cannot!

I discovered that the files effected were all in a subdirectory off the main source directory. I tried replacing “#include “stdafx.h” with “#include “..stdafx.h”. This fixed the intellisense problem but now the file will not compile:

Error 6 error C1010: unexpected end of file while looking for precompiled header. Did you forget to add ‘#include “StdAfx.h”‘ to your source?

This after a number of warning C4627 including for “..stdafx.h” (skipped when looking for precompiled header use). So it seems that Intellisense and the compiler use different search rules when looking for header files and that the compiler will only recognise
the pre-compiled header file if it is specified exactly without a path.

I did find a work-round for this bug: have two include lines as follows:

#include "stdafx.h"
#include "..stdafx.h"

Now both Intellisense and compiler work, with just the one Intellisense error squiggle under the first #include.

Please let me know if there is a setting to fix this properly, although even if there is there is still a bug but it would then be in the project migration process.

In VSC++, If I create a project with “Empty project” which is without “Precompiled header”, the project will be empty, but if I wanted to use that #include "stdafx.h" inside my “Empty” project, it doesn’t works…

but if I create a project with “Precompiled header”, it can work fine.

both the condition above having exactly the same code(Both have #include "stdafx.h" ), but only the one with “Precompile header” Project can work…

May I know how to solve this problem in “Empty Project”??

This is the error when creating the project in “Empty Project”

fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory
1>

lastly, Can I know what is #include "stdafx.h" for? Thanks…

but if I wanted to use that #include “stdafx.h” inside my “Empty” project, it doesn’t works…

Of course not. stdafx is the precompiled header. If you don’t have a precompiled header, then how can you include it?

May I know how to solve this problem in “Empty Project”??

It’s not really a problem. Just don’t include that header.

Or if you must (if you have dozens of files and you don’t want to modify them all), you can “fake” it by creating a blank file named “stdafx.h”.

Can I know what is #include “stdafx.h” for?

When you #include a header file, it’s sort of like copy/pasting that header file into the cpp file. The compiler will walk through, examine, and compile that header whenever you compile the cpp file.

The compiler will do this process for every cpp file that includes that header. So if you have 100 cpp files in your project and they all include the same header, that header is being compiled 100 times.

If the header is very large, this might cause the computer to take a long time to compile your program. So compilers give you an option to “precompile” a header so that it compiles only once. Then each cpp file that #includes it does not have to re-compile it every time, they can just use the precompiled version. It can speed up compile time.

MSVS likes to name the default precompiled header “stdafx.h”. But that’s all it is.

It’s worth noting that precompiled headers are completely worthless unless you are seeing slow compile times. I avoid them unless they make a significant difference in compile time.

Thanks…
Is that means #include "stdafx.h" is called precompiled header where as #include <iostream> , #include <conio.h> and so on is a library header? Or it’s call precompiled header as well?

From what u said, it’s completely worthless, is that means, without that #include "stdafx.h" , my system can works fine also?

Is that means #include “stdafx.h” is called precompiled header where as #include <iostream> , #include <conio.h> and so on is a library header?

Not really. A precompiled header can be named anything. “stdafx” is just the default name for it in VS.

Precompiling is a compiler setting. You can precompile any header, even library headers like <iostream>.

From what u said, it’s completely worthless, is that means, without that #include “stdafx.h” , my system can works fine also?

Yes. Enabling precompiled headers does absolutely nothing other than change how fast the compile can build the exe. The final program will be identical whether or not you use precompiled headers.

A precompiled header can be named anything.

If I named it as “ABC”, it will works too?

Enabling precompiled headers does absolutely nothing other than change how fast the compile can build the exe.

U mean if have that #include "stdafx.h" , the system can build exe file faster? Is that what u mean? I though if we put more header, the time require to compile will be longer, am I right?

TQ….

If I named it as “ABC”, it will works too?

Yes. The header can be named anything, as long as the compiler knows to precompile that header.

U mean if have that #include “stdafx.h” , the system can build exe file faster?

Yes, that’s the idea. Whether or not it REALLY makes it faster depends. Usually it won’t make much/any difference unless stdafx.h is a very big header.

I though if we put more header, the time require to compile will be longer, am I right?

Yes you are right.

Compile time is longer with more headers because the compiler had to compile each header when it is included.

However, if the headers are precompiled it doesn’t have to compile them because they have been precompiled already. Which is why it’s faster.

However, if the headers are precompiled it doesn’t have to compile them because they have been precompiled already. Which is why it’s faster.

But u said precompiled header has nothing to do with our program right? Then how to precompile my header since my header used is like #include <iostream> and #include <conio> but not #include "stdafx.h"

Is that u mean in one program, I use many (let said 3) #include <iostream> and #include <conio> and if I include that Precompile header (#include “stdafx.h”), then it runs #include <iostream> and #include <conio> only once instead of 3 is it?

And another condition is I use many(let said 3) #include <iostream> and #include <conio> , but not include that Precompile header (#include “stdafx.h”) this time, so, is that mean my program will runs #include <iostream> and #include <conio> 3 times?

Yes, that’s the idea. Whether or not it REALLY makes it faster depends. Usually it won’t make much/any difference unless stdafx.h is a very big header.

U mean stdafx.h is a big header? That header can be big? I thought it’s just a constant header which is same size(won’t change) with everyone? And somehow, if header is bigger, the time to compile should be longer right? But why big header become faster? Not really understand…can u help explain…

TQ…

Last edited on

The basic idea of precompiled header is: once parsed, used ever after.

Everything in this precompiled header (definitions or other includes) are put together in a file that is used instead of the precompiled header (#include “stdafx.h”) itself. It’s supposed to be faster, because the compiler doesn’t need to open those includes and no more parsing is required.

You can put everything that doesn’t change (like #include <iostream> and #include <conio>) in that precomiled header. Only the project specific headers are left out.

That’s the idea.

The problem is that the precompiled file quickly becomes that hugh that navigating within is not faster then opening and parsing the headers when needed. Plus it turns out that the precompiled header file is error prone and you get problems while compiling.

The best is to disable precompiled header and forget about that once and forever.

Thanks coder776,

You can put everything that doesn’t change (like #include <iostream> and #include <conio>) in that precomiled header. Only the project specific headers are left out.

From here, can I know how to put them #include <iostream> and #include <conio> inside precompiled header (#include “stdafx.h”)? Example to the code below, how to put that 2 header inside stdafx.h? Thanks

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <conio>

int main()
{
	int a,b,c;


   cin>>a;
   cin>>b;
   c=a+b;
   cout<<"The value c is n"<<c;
   getch();
   return 0;
}

Well, create a file in that directory where your main file is. Name it stdafx.h. Cut and copy line 1/2 to that file. the first line of your main file (and all other implementation files) must be #include “stdafx.h”

Thanks…

u mean create one main file which have the 1st line as #include “stdafx.h” and the next line will be the library header like the one below is it?

1
2
3
#include "stdafx.h"
#include <iostream>
#include <conio> 

how about the rest? I mean is there anything after line 3? Or just need line 1-3? TQ…

Last edited on

no I mean that you create a file stdafx.h and place #include <iostream> and #include <conio> there.

in the file stdafx.h there’re only the lines 2 and 3.

the main file is the file where ‘int main()’ is. I don’t know how you named it. This would look like so:

Your main file:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdafx.h"

int main()
{
	int a,b,c;


   cin>>a;
   cin>>b;
   c=a+b;
   cout<<"The value c is n"<<c;
   getch();
   return 0;
}

stdafx.h

1
2
#include <iostream>
#include <conio> 

Last edited on

I think you’re missing some fundamental concept.

The compiler is going to parse and compile every included file every time it compiles a source file (which is every time you change a source file). So for an example, let’s say you have the following files:

1
2
3
4
// myclass.h
#include <string>

class MyClass {  /*... */ };

1
2
3
4
// stdafx.h
#include <windows.h>
#include <iostream>
#include "myclass.h" 

1
2
3
4
// main.cpp
#include "stdafx.h"

// ... 

1
2
3
4
// support.cpp
#include "stdafx.h"

//... 

When you build this project,

if you do not have a precompiled header

the compiler is going to compile the 2 source files main.cpp and support.cpp. When it does, it will do this:

Compiling main.cpp
– found #include “stdafx.h” in main.cpp, so start compiling stdafx.h
– found #include <windows.h> in stdafx.h, so start compiling windows.h
– found XXX other includes in windows.h, so compile all those headers as well
– found #include <iostream> in stdafx.h, so start compiling that header
– found XXX other includes in iostream, so compile all those as well
– found #include “myclass.h” in stdafx.h, so compile that header
– stdafx.h finish, continue compiling main.cpp

Compiling support.cpp
– found #include “stdafx.h” in support.cpp, so start compiling stdafx.h
– found #include <windows.h> in stdafx.h, so start compiling windows.h
– found XXX other includes in windows.h, so compile all those headers as well
– found #include <iostream> in stdafx.h, so start compiling that header
– found XXX other includes in iostream, so compile all those as well
– found #include “myclass.h” in stdafx.h, so compile that header
– stdafx.h finish, continue compiling support.cpp

Now…

if you make stdafx.h a precompiled header

, the compiler will do this instead:

PreCompiling stdafx.h
– found #include <windows.h> in stdafx.h, so start compiling windows.h
– found XXX other includes in windows.h, so compile all those headers as well
– found #include <iostream> in stdafx.h, so start compiling that header
– found XXX other includes in iostream, so compile all those as well
– found #include “myclass.h” in stdafx.h, so compile that header
– stdafx.h is now compiled, put compiled information in a new “stdafx.pch” file

Compiling main.cpp
– found #include “stdafx.h”, but I already compiled that header, so no need to compile it again. Just use the info in the existing pch file.
– continue compiling main.cpp

Compiling support.cpp
– found #include “stdafx.h”, but I already compiled that header, so no need to compile it again. Just use the info in the existing pch file.
– continue compiling support.cpp

That’s all it does. It just compiles the stuff once so it doesn’t need to be compiled every time.

Last edited on

Thanks coder777 and Disch

I think I understand already…

just another question for coder777, as u said

Well, create a file in that directory where your main file is. Name it stdafx.h. Cut and copy line 1/2 to that file. the first line of your main file (and all other implementation files) must be #include “stdafx.h”

first line of your main file (and all other implementation files) must be #include “stdafx.h”

is that must be 1st line? or any line before int main () are allow(maybe put the header after other library file) ? Is that ok? Thanks…

Добавить комментарий