Не удается открыть источник файл stdafx h как исправить

Не удается открыть источник файл "stdafx.h" и не только C++ Решение и ответ на вопрос 1260286

serega006

9 / 9 / 6

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

Сообщений: 423

1

21.09.2014, 20:20. Показов 131019. Ответов 41

Метки нет (Все метки)


Вообщем ситуация: написал код в универе на visual studio 2008, пришел домой, скопировал этот же код в 2013 версию и получил следующие ошибки: 1)Не удается открыть источник файл «stdafx.h» 2)идентификатор «printf» не определен 3)идентификатор «scanf» не определен. В универе все работает. код:

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
#include "stdafx.h"
#include <math.h>
#include <conio.h>
#include "clocale"
int kvadur(float a, float b, float c,
           float* x1, float* x2)
 {
  if(a==0.0) return -1;
float d= b*b-4*a*c;
if(d<0.0) return 0;
if(x1==NULL||x2==NULL) return -1;
*x1=(-b+sqrt(d))/(2*a);
*x2=(-b-sqrt(d))/(2*a);
 
if(*x1==*x2) return 1;
return 2;
}
 
int main()
{   
    setlocale(LC_ALL, "Russian");
    printf("nРешение квадратного уравненияn");
    printf("nВедите в одной строке коэффициенты и нажмите <Enter>n");
    printf("->");
 
    float a,b,c;
    float x1,x2;
 
    scanf("%f%f%f",&a,&b,&c);
 
    int n = kvadur(a,b,c,&x1,&x2);
    switch(n)
    {
    case -1:
        printf("ошибка исходных данных");
        break;
    case 0:
        printf("Уравнение не имеет решения");
        break;
    case 1:
        printf("Корни одинаковые: x=%3.2f",x1);
        break;
    case 2:
        printf("x1=%3.2f x2=%3.2f",x1,x2);
            break;
    }
    printf("nДля заверешения нажмите любую клавишу...");
    getch();
 
    return 0;
}

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



zss

Модератор

Эксперт С++

12641 / 10135 / 6102

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

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

21.09.2014, 20:25

2

Цитата
Сообщение от serega006
Посмотреть сообщение

#include «stdafx.h»
#include <math.h>
#include <conio.h>
#include «clocale»

Замените на

C++
1
2
3
4
#include <math.h>
#include <conio.h>
#include <stdio.h>
#include <locale.h>



1



9 / 9 / 6

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

Сообщений: 423

21.09.2014, 20:28

 [ТС]

3

Выдает новую ошибку: error C4996: ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.



0



zss

Модератор

Эксперт С++

12641 / 10135 / 6102

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

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

21.09.2014, 20:43

4

scanf_s — это микрософтовская приблуда.
Поскольку Вы используете C++, то советую все scanf заменить на потоковые классы (cin,cout)

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
int main()
{   
    setlocale(LC_ALL, "Russian");
    cout<<("nРешение квадратного уравненияn";
    cout<<("nВедите в одной строке коэффициенты и нажмите <Enter>n->";
    float a,b,c;
    float x1,x2;
 
    //scanf("%f%f%f",&a,&b,&c);
    cin>>a>>b>>c;
 
    int n = kvadur(a,b,c,&x1,&x2);
    switch(n)
    {
    case -1:
        cout<<"ошибка исходных данных";
        break;
    case 0:
        cout<<"Уравнение не имеет решения";
        break;
    case 1:
        cout<<"Корни одинаковые: x=%3.2f"<<x1<<endl;
        break;
    case 2:
        cout<<"x1="<<x1<<' '<<"x2="<<x2<<endl;
        break;
    }
    system("pause");
     return 0;
}



1



9 / 9 / 6

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

Сообщений: 423

21.09.2014, 20:56

 [ТС]

5

Дело в том что в универе мы вроде как пишем на си, но в визуале так же выбираем проект с++, моя цель это возможность компилировать тот код который я делаю в универе дома, без установки визуала 2008 года. Может можно как то подключить stdafx.h? как я понял printf и scanf в нем и лежат.



0



Модератор

Эксперт С++

12641 / 10135 / 6102

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

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

21.09.2014, 21:03

6

Цитата
Сообщение от serega006
Посмотреть сообщение

Может можно как то подключить stdafx.h? как я понял printf и scanf в нем и лежат.

printf и scanf Лежат в <stdio.h>
А stdafx.h — это файл предварительно скомпилированных заголовков.
Если создается пустой проект, то такой файл включать не надо.



1



9 / 9 / 6

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

Сообщений: 423

21.09.2014, 21:21

 [ТС]

7

То есть из вариантов только качать 2008 версию и более никак?



0



Модератор

Эксперт С++

12641 / 10135 / 6102

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

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

21.09.2014, 21:32

8

Нелогичный вывод.
Поменяйте scanf на scanf_s и ВСЕ!



1



Модератор

Эксперт по электронике

8760 / 6550 / 887

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

Сообщений: 22,976

21.09.2014, 21:51

9

Лучший ответ Сообщение было отмечено Убежденный как решение

Решение

Цитата
Сообщение от serega006
Посмотреть сообщение

как я понял printf и scanf в нем и лежат.

printf и scanf это небезопасные функции
соответственно микрософт ввел свои( scanf_s)
до 2010 scanf вызывал предупреждение, сейчас ошибку
где то это отключается,но у меня фирменная 2008,менять не планирую, посему не могу подсказать где, поищи по форуму
или воспользуйся советом zss, тем более что scanf_s в 2008 есть



1



9 / 9 / 6

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

Сообщений: 423

21.09.2014, 22:11

 [ТС]

10

Увы scanf_s не спасает, на этот раз ошибка error C4996: ‘getch’: The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getch. See online help for details. И что то мне подсказывает что в дальнейшем при попытке запустить код с универа дома будут возникать проблемы требующие изменения кода, а чем дальше в лес тем больше кода придется править, поэтому более логичного решения кроме как поставить версию 2008, которая каким то неизвестным мне способом компилирует то что не компилирует 2013.



0



Модератор

Эксперт С++

12641 / 10135 / 6102

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

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

21.09.2014, 22:14

11

То же самое замените getch на _getch

Добавлено через 1 минуту
Не будет — в 2008 студии — это выводилось как предупреждения.



1



serega006

9 / 9 / 6

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

Сообщений: 423

21.09.2014, 23:07

 [ТС]

12

А проблемки все таки возникают не только со scanf и и getch. Вот например второй код

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
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include "clocale"
#define FNAME "D:\numbers.txt"
#define N 5
 
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    char fname[20]=FNAME;
    FILE* out;
    int n;
 
    printf("Создание файлаn");
    printf("Введённые числа будут записаны в файл: %snn", fname);
    printf("После ввода каждого числа нажимайте <Enter>n");
 
    out=fopen(fname, "wt");
    if(out==NULL)
    {
        printf("Ошибка открытия файла для записиn");
        getch();
        return 1;
    }
 
    for (int i=0; i<N; i++)
    {
        printf("->");
        scanf("%i",&n);
        fprintf(out, "%i ",n);
    }
 
    fclose(out);
    printf("nВведённые числа записаны в файл %sn", fname);
    printf("Для завершения нажмите <Enter>");
    getch();
 
    return 0;
}

Итак первая и единственная ошибка намекает сменить fopen на fopen_s, заменяем и получаем вместо нее 4 ошибки: 1) error C2660: fopen_s: функция не принимает 2 аргументов 2) значение типа «errno_t» нельзя присвоить сущности типа «FILE *» 3)аргумент типа «char *» несовместим с параметром типа «FILE **» 4)слишком мало аргументов в вызове функции.
И собственно из этого я и сделал вывод что в дальнейшем придется много чего править что бы запустить компиляцию.



0



ValeryS

Модератор

Эксперт по электронике

8760 / 6550 / 887

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

Сообщений: 22,976

21.09.2014, 23:15

13

Цитата
Сообщение от serega006
Посмотреть сообщение

rror C2660: fopen_s: функция не принимает 2 аргументов

правильно
это безопасная функция, ей нужно еще количество символов дать

приведу пример чтоб было понятно

C++
1
2
char buf[2];
scanf("%s",buf);

теперь введи строку символов этак на 100( можно и меньше, главное чтобы больше чем один символ)
и все программа рухнет, переполнение стека
в scanf_s вводишь количество символов(2) и можешь хоть завводится, больше 2х символов не запишет

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



1



5493 / 4888 / 831

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

Сообщений: 13,587

21.09.2014, 23:55

14

Цитата
Сообщение от serega006
Посмотреть сообщение

Выдает новую ошибку: error C4996: ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

Как отключить в свойсвах проекта:
https://www.cyberforum.ru/post5488517.html
Или, выше всех инклудов, прописать: #define _CRT_SECURE_NO_WARNINGS (для getch() не работает, нужно заменить на _getch()).
Или ниже всех инклудов прописать: #pragma warning(disable : 4996)



2



Рожденная для битвы

285 / 64 / 12

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

Сообщений: 1,227

06.10.2014, 09:08

15

alsav22, #define _CRT_SECURE_NO_WARNINGS не помогло почему-то, только #pragma warning(disable : 4996)

Что означает тип errno_t?



0



5493 / 4888 / 831

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

Сообщений: 13,587

06.10.2014, 09:12

16

Цитата
Сообщение от marina2
Посмотреть сообщение

#define _CRT_SECURE_NO_WARNINGS не помогло почему-то

В каком коде? Выше всех инклудов писали? Список ошибок.



0



marina2

Рожденная для битвы

285 / 64 / 12

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

Сообщений: 1,227

06.10.2014, 09:18

17

alsav22, необходимо же после всех ошибок. Беда в том, что от него никакого толка. Все равно вылазит ошибка

C++
1
Error   1   error C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.  c:usersmarinadocumentsvisual studio 2013projectsconsoleapplication1consoleapplication1consoleapplication1.cpp



0



5493 / 4888 / 831

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

Сообщений: 13,587

06.10.2014, 09:20

18

Цитата
Сообщение от marina2
Посмотреть сообщение

необходимо же после всех ошибок.

Что после всех ошибок? Код покажите.



0



Рожденная для битвы

285 / 64 / 12

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

Сообщений: 1,227

06.10.2014, 09:24

19

alsav22, необходимо же после всех инклудов. Правка

Добавлено через 1 минуту
Подскажите лучше про Что означает тип errno_t?



0



5493 / 4888 / 831

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

Сообщений: 13,587

06.10.2014, 09:29

20

Цитата
Сообщение от marina2
Посмотреть сообщение

необходимо же после всех инклудов.

Кому необходимо? Чтобы работало:

Цитата
Сообщение от alsav22
Посмотреть сообщение

Или, выше всех инклудов, прописать: #define _CRT_SECURE_NO_WARNINGS (для getch() не работает, нужно заменить на _getch()).

Добавлено через 46 секунд

Цитата
Сообщение от marina2
Посмотреть сообщение

Подскажите лучше

Лучше делайте правильно, и не пишите, что не работает, если делаете по-своему.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

06.10.2014, 09:29

20

E1696 не удается открыть источник файл

Я пытаюсь создать решение на Visual Studio Community 2017, но получаю сообщение об ошибке «Не удается открыть файл включения: ‘stdio.h’ «. Я прочитал несколько похожих вопросов, но все еще не могу решить эту проблему. Похоже, stdio.h файл вызывается в stdafx.h файл. Ниже приведены подробности. Какие-либо предложения? (Я пока не могу встраивать изображения, поэтому, пожалуйста, нажмите на ссылки для скриншотов.)

Детали системы:
Windows 10
Visual Studio Community 2017 v.15.2 (26430.6)
— Установленная разработка рабочего стола с C ++ (Снимок экрана: Список установки )

Шаг 1: Я написал знаменитую программу Hello World на C ++.

Шаг 2: Я нажал на Построить> Построить решение.

Проблема: ‘Stdio.h’: Данный файл или каталог отсутствует. Полная ошибка:

Детали по устранению неполадок / Вещи, которые я пробовал:

  1. Свойства конфигурации> Каталоги VC ++
    Include Directories $(VC_IncludePath);$(WindowsSDK_IncludePath);
  2. Снимок экрана: Solution Explorer (файлы в проекте)

Код в stdafx.cpp файл:

Код в stdafx.h файл:

Обратите внимание #include за а также оба имеют красную линию загогулины внизу и говорят «не может открыть исходный файл».
TRIED: я попытался удалить последние две строки, но потом я получил больше ошибок.

ПОПРОБУЙТЕ: так как многие предположили, что stdafx.h не требуется, я попытался удалить только первую строку, #include «stdafx.h» , Но для того, чтобы это сработало, мне пришлось сделать немного больше. СМОТРИТЕ ОТВЕТ.

Решение

Возникла та же проблема с переносом проекта с VS2013 на VS2017,
Исправлено: измените «Свойства-> Общие-> Версия Windows SDK» на 10

Другие решения

Столкнулся с проблемой пропавших без вести stdlib.h а также stdio.h (а может и больше) после установки VS2017 Community на новый компьютер и переноса решения с VS2013 на VS2017.

Используемый @ Максим Акристиный предложение, но все равно получено сообщение об ошибке совместимости набора инструментов. Однако сама VS предложила сделать ретаргетинг решения, щелкнув правой кнопкой мыши на решении в Обозреватель решений, затем выбрав Retarget solution из меню и обновленный Windows SDK Version из выпадающего списка.

Сейчас мои проекты строятся без проблем.

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

Есть три способа решить эту проблему.

  1. Игнорировать предварительно скомпилированные заголовки # 1
    шаги: Проект> Свойства> Свойства конфигурации> C / C ++> Командная строка> в поле Дополнительные параметры добавьте / Y-. (Снимок экрана со страницами свойств )> ОК> Удалить #include «stdafx.h»
  2. Игнорировать предварительно скомпилированные заголовки # 2
    шаги: Файл> Создать> Проект> …> В окне мастера приложений нажмите кнопку Далее> Снимите флажок «Предварительно скомпилированный заголовок»> «Готово»> «Удалить». #include «stdafx.h»

Переустановите Visual Studio
Это также сработало для меня, потому что я понял, что, возможно, что-то не так с моим Windows SDK. Я использовал Windows 10, но с Windows SDK 8.1. У вас может быть и эта проблема.
шаги: Откройте установщик Visual Studio> щелкните трехстрочную строку меню> Удалить> Перезагрузите компьютер> Откройте установщик Visual Studio> Установите то, что вам нужно, но убедитесь, что вы устанавливаете только последнюю версию Windows SDK 10, а не несколько или 8.1.

Когда я устанавливал Visual Studio в первый раз, я получал сообщение о том, что мне нужно установить Windows SDK 8.1. Так я и сделал с помощью опции Modify установщика Visual Studio. Возможно, это было проблемой, потому что я установил ее после того, как Visual Studio уже была установлена, или потому что мне нужен SDK 10 вместо этого. Просто чтобы быть в безопасности, я сделал полную переустановку.

У меня была похожая проблема после обновления моего VS2017. Проект построен хорошо; но много «ошибок», когда код был поднят в редакторе. Даже попробовал переустановить VS. Я смог решить эту проблему, установив для параметра «Игнорировать стандартные пути включения» значение «Да». Попытка построить решение с большим количеством ошибок. Вернулся и установил опцию на Нет. После восстановления моя проблема ушла.

Если вы не хотите использовать Windows SDK для Windows 10 (например, вы можете работать над проектом с открытым исходным кодом, решение которого не принимается вами), вы можете решить эту проблему в проекте Windows SDK 8.1 с помощью навигационный Tools -> Get Tools and Features. -> Individual Compontents tab и установка отдельных компонентов «Windows 8.1 SDK» (в составе SDK, библиотек и сред) и «Windows Universal CRT SDK» (в разделе «Компиляторы», средства сборки и среды выполнения):

У меня была такая же проблема при создании VS 2013 Project с помощью Visual Studio 2017 IDE.
Решением было установить правильный «Platformtoolset v120 (Visual Studio 2013)». Для этого должен быть установлен Windows SDK 8.1.
Если вы хотите использовать Platformtoolset v141 (Visual Studio 2017), необходимо установить Windows SDK 10.
Platformtoolset может быть выбран в диалоге свойств проекта: General -> Platformtoolset

526 просмотра

1 ответ

103 Репутация автора

Я пытаюсь использовать графическую библиотеку (SFML) для C ++, и у меня возникли проблемы. Я использую Visual Studio 2017. Я посмотрел много уроков на Youtube и получаю ту же ошибку с каждым, что пытаюсь. Я не могу найти решение, так как люди говорят «папки должны быть вместе», что я уже сделал: Вот ошибки, которые я получаю:

E1696 не может открыть исходный файл «stdafx.h» c: Users George source repos Game Game main.cpp 1

E0065 ожидал ‘;’ c: Users George source repos Game Game main.cpp 5

E1696 не может открыть исходный файл «SFML / Graphics.hpp» c: Users George source repos Game Game main.cpp 2

C1083 Невозможно открыть включаемый файл: ‘stdafx.h’: такого файла или каталога нет: c: users george source repos game game main.cpp 1

Код, который я запускаю (скопированный, с дополнительным):

Раньше в коде не было stdafx.h или std пространства имен, поэтому мне пришлось добавить их, потому что у меня были другие ошибки. Я был бы очень признателен за любую помощь. Спасибо

Ответы (1)

103 Репутация автора

Разобрался несколько дней назад, но забыл опубликовать, как я это исправил. Я скачал 32-битную версию SFML. В свойствах необходимо убедиться, что в нем написано: «Active (win32)» или что-то в этом роде. У меня был мой на «x64», поэтому он не работал. Надеюсь, что это помогло кому-то еще с той же проблемой

Я пытаюсь использовать графическую библиотеку (SFML) для C ++, и у меня возникли проблемы. Я использую Visual Studio 2017 Я наблюдал много учебников Youtube, и получить ту же ошибку с каждым я стараюсь. Я не могу найти решение, как люди говорят «папки должны быть вместе» , которые я уже сделал: Вот ошибки я получаю:

E1696 не может открыть исходный файл stdafx.h C: Users George источник Repos Game Game main.cpp 1

E0065 ожидается «;» C: Users George источник Repos Game Game main.cpp 5

E1696 исходный файл не может открыть SFML / Graphics.hpp C: Users George источник Repos Game Game main.cpp 2

C1083 Невозможно открыть файл включать: ‘stdafx.h’: Нет такого файла или каталога C: Users ДЖОРДЖ источник Repos игры игры main.cpp 1

Код я бег (скопировано с дополнительным):

Перед тем, код не имеют stdafx.h или патезрасе, так что я должен был добавить их, потому что у меня были другие ошибки. Я бы очень признателен за любую помощь. благодаря

Gray Pipe

This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.

Answered by:

Question

I just created a new project using the existing files of an old one I was sent but when I try to build it I get this error despite the file is in the include-directory of the project.

How can this be?

Answers

Whereever u find the following statement

Place the cursor within the «stdafx.h» and right click, then Choose open Document «stdafx.h»

Tell me if it is opening or not in VS2005 If the posted one is answer, Please close the Post. — NambiRaj

  • Marked as answer by Rong-Chun Zhang Friday, August 22, 2008 5:22 AM

All replies

I’m using VS2008 SP1 and the application target is a Windows Mobile device.

Can not include stdafx.h -> atlbase.h #2910

Background: the vscode-cpptools plugin is not correctly resolving default compiler defines in my cross-platform code base (separate issue).

Although, I am compiling targeting android arm, using clang, the intellisense is still trying to resolve windows headers wrapped in ifdefs.

My work around is to just include all the directories of the default include folder for msvc.

Enter my new issue.

I have foo.cpp which exists outside my workspace root, but is included in my «includePath».

In foo.cpp, the following line exists.

with the following error.

«cannot open source file «atlbase.h» (dependency of «stdafx.h»)»

If I open stdafx.h, I get the following line.

cannot open source file «atlbase.h»

I have included both of the directories that these header files exist in, and the problem persists.

These two lines have been added to my «includePath» in c_cpp_properties.json

The text was updated successfully, but these errors were encountered:

safield commented Dec 10, 2018

atlbase.h exists under atlmfc/include. That is the only place it exists under the VC directory.

The paths listed are being logged by the plugin.

Processing folder (recursive): C:/PROGRAM FILES (X86)/MICROSOFT VISUAL STUDIO 11.0/VC/ATLMFC/INCLUDE/
Processing folder (recursive): C:/PROGRAM FILES (X86)/MICROSOFT VISUAL STUDIO 11.0/VC/ATLMFC/SRC/MFC/

sean-mcmanus commented Dec 10, 2018

Those logs aren’t from the IntelliSense process (they’re for the symbol parser). If you set your loggingLevel to Debug and then open a C/C++ file you should see the includes/defines in the logs.

safield commented Dec 10, 2018

When I open foo.cpp, the only things logged are.

When I open a file within the workspace root, a bunch of includes are listed, including the pertinent ones.

include: C:PROGRAM FILES (X86)MICROSOFT VISUAL STUDIO 11.0VCATLMFCINCLUDE
include: C:PROGRAM FILES (X86)MICROSOFT VISUAL STUDIO 11.0VCATLMFCSRCMFC

sean-mcmanus commented Dec 10, 2018

I assume that’s when opening the file with the #include <atlbase.h> . I’m not sure what could cause include to not be found. Can you provide a self-contained repro project?

safield commented Dec 10, 2018

Here is a minimal project that fails to include atlbase.h on my system
IncludeTest.zip

sean-mcmanus commented Dec 10, 2018

It doesn’t repro for me with VS 2017, but I’ll see if I can get VS 2012 and/or the Android tools.

safield commented Dec 10, 2018

Turns out this is not an accurate repro case. There is just a new error causing the squiggles this time around.

cannot open source file «errno.h» (dependency of «atlbase.h»)

sean-mcmanus commented Dec 11, 2018

For me that is found in C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\ucrt , but with VS 2012 it might be at a different location. Are you able to install a newer VS? VS 2017 is able to side-by-side install on any drive, unlike older VS versions.

safield commented Dec 11, 2018 •

Here is a more accurate minimal repro example.

Observe the include in the file «someheader.h».
IncludeTest.zip

safield commented Dec 11, 2018 •

I have just installed VS2017.

-the error for #include <atlbase.h>, in «someheader.h» said that it cannot find atlbase.h.
-the path that contains «atlbase.h» was added to the includePath.

C:Program Files (x86)Microsoft Visual Studio 11.0VCatlmfcinclude

I then installed VS2017, and changed nothing for my cpptools configuration, and left VS2012 installed.

VS2017:
-the error for #include <atlbase.h>, in «someheader.h» said «cannot open source file «errno.h» (dependency of «atlbase.h»)».
-it can now find and jump to definition of «atlbase.h», in the VS2017 install folder. I did NOT include this folder in my include path.

the folder that contains errno.h is added to the includePath.

C:Program Files (x86)Microsoft Visual Studio 11.0VCinclude

Just the act of installing VS2017, changed the behaviour of the cpptools plugin.

sean-mcmanus commented Dec 11, 2018

Yeah, we automatically detect the VS 2017 include path and add it if msvc-x64 mode is being used. The missing errno.h is from a missing Windows Kits. Adding the path to the errno.h should fix the issue, although if you’re using a multi-root workspace you may need to update the settings for the other folder as well, unless you set the «C_Cpp.default.includePath» instead so it applies to multiple folders.

michelleangela commented Aug 19, 2019

Closing this issue due to long inactivity. If you update to the latest version of the C/C++ extension and your issue still persists, please re-open the issue and reply with additional information that can help us investigate the issue.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Problem

This message appears during the compilation of Microsoft Visual® C++ code generated by IBM Rational® Rose®:
«Cannot open include file: ‘stdafx.h’: No such file or directory»?

Cause

As the error message says, the compiler is finding an include statement for the header file «stdafx.h», but can’t find the file itself.

Rose is generating the following line: #include «stdafx.h» by default.

#include «stdafx.h»

The file stdafx.h is usually used as a precompiled header file. Precompiled headers help to speed up compilation when a group of files in a project do not change.

Resolving The Problem

If a precompiled header is not used, this include shouldn’t get generated in the code. To turn it off, open the Visual C++ Component Properties dialog and in the tab «Includes» delete the text in the «Initial Source Includes».

Another possibility is to create an empty «stdafx.h» file.

For more information about precompiled header files, refer to the Microsoft knowledge base.

[{«Product»:{«code»:»SSSHEM»,»label»:»Rational Rose Enterprise»},»Business Unit»:{«code»:»BU053″,»label»:»Cloud & Data Platform»},»Component»:»—«,»Platform»:[{«code»:»PF033″,»label»:»Windows»}],»Version»:»2003.06.00″,»Edition»:»»,»Line of Business»:{«code»:»LOB45″,»label»:»Automation»}}]

Historical Number

152592215

Содержание

  1. Неустранимая ошибка C1083
  2. Указано неверное имя файла
  3. Файл не включен в путь поиска включения
  4. Проблемы со сторонними библиотеками и vcpkg
  5. Файл находится в проекте, но не включает путь поиска
  6. Среда INCLUDE или LIB командной строки не задана
  7. Файл может быть заблокирован или использоваться
  8. Включена неправильная версия имени файла
  9. Предкомпилированные заголовки еще не скомпилированы
  10. Дополнительные причины
  11. Пример
  12. Error c1083 не удается открыть файл включение stdafx h no such file or directory
  13. Answered by:
  14. Question
  15. Для новичков про stdafx.h
  16. Для чего нужны Precompiled Headers
  17. Как работают Precompiled Headers
  18. Как использовать Precompiled Headers
  19. Life hack
  20. Что включать в stdafx.h
  21. Несколько Precompiled Headers
  22. Типовые ошибки при использовании Precompiled Headers
  23. Fatal error C1083: Cannot open precompiled header file: ‘Debugproject.pch’: No such file or directory
  24. Fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add ‘#include «stdafx.h»’ to your source?
  25. 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)
  26. Из-за precompiled header компилятор глючит
  27. Из-за precompiled headers проект постоянно перекомпилируется целиком
  28. Творится что-то непонятное
  29. Проект, использующий precompiled headers не удаётся проверить с помощью PVS-Studio
  30. Заключение

Неустранимая ошибка C1083

Компилятор создает ошибку C1083, если не удается найти необходимый файл. Эта ошибка имеет несколько возможных причин. Неправильный путь поиска или отсутствующие или неправильно именуемые файлы заголовков являются наиболее распространенными причинами, но другие типы файлов и проблемы также могут вызвать C1083. Ниже приведены некоторые распространенные причины, по которым компилятор создает эту ошибку.

Указано неверное имя файла

При вводе имени файла допущена ошибка. Например, примененная к объекту директива

может не найти файл, который вы хотели. Большинство файлов заголовков стандартной библиотеки C++ не имеют расширения H-файла. Заголовок не найден этой #include директивой. Чтобы устранить эту проблему, убедитесь, что введено правильное имя файла, как в следующем примере:

Некоторые заголовки библиотеки времени выполнения C расположены в подкаталоге стандартного каталога включения. Например, чтобы включить sys/types.h , необходимо включить sys имя подкаталога в директиву #include :

Файл не включен в путь поиска включения

Компилятору не удается найти файл, используя правила поиска, которые указаны в директиве #include или #import . Например, если имя файла заголовка заключено в кавычки,

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

Если имя заключено в угловые скобки,

компилятор следует пути поиска, определяемого средой сборки, /I параметром компилятора, /X параметром компилятора и переменной среды INCLUDE . Дополнительные сведения, включая конкретные сведения о порядке поиска, используемом для поиска файла, см. в директиве #include (C/C++) и директиве #import.

Если файлы включения находятся в другом каталоге относительно исходного каталога и используете относительный путь в директивах include, следует использовать двойные кавычки вместо угловых скобок. Например, если файл myheader.h заголовка находится в подкаталоге источников проекта с именами заголовков, в этом примере не удается найти файл и вызвать C1083:

но этот пример работает:

Относительные пути также можно использовать с каталогами в пути поиска включения. Если вы добавляете каталог в переменную среды INCLUDE или в путь include directories в Visual Studio, не добавляйте часть пути к директивам include. Например, если заголовок находится по адресу pathexampleheadersmyheader.h и добавляется pathexampleheaders в путь включения каталогов в Visual Studio, но директива #include ссылается на файл как

затем файл не найден. Используйте правильный путь относительно каталога, указанного в пути поиска include. В этом примере можно изменить путь pathexample поиска включения или удалить headers сегмент пути из директивы #include .

Проблемы со сторонними библиотеками и vcpkg

Если эта ошибка возникает при попытке настроить стороннюю библиотеку в рамках сборки, рассмотрите возможность использования vcpkg, диспетчера пакетов C++ для установки и сборки библиотеки. vcpkg поддерживает большой и растущий список сторонних библиотек и задает все свойства и зависимости конфигурации, необходимые для успешных сборок в рамках проекта.

Файл находится в проекте, но не включает путь поиска

Даже если файлы заголовков перечислены в Обозреватель решений как часть проекта, файлы обнаруживаются компилятором только в том случае, если они ссылаются #include на исходный файл или #import директиву и находятся в пути поиска включаемых файлов. Для различных типов построений могут использоваться разные пути поиска. Параметр /X компилятора можно использовать для исключения каталогов из пути поиска включения. Это позволяет использовать для разных построений разные файлы include, которые имеют одно имя, но расположены в разных каталогах. Таким образом создается альтернатива условной компиляции с помощью команд препроцессора. Дополнительные сведения о параметре /X компилятора см. в разделе /X (Пропуск стандартных путей включения).

Чтобы устранить эту проблему, исправьте путь, используемый компилятором для поиска включаемого или импортируемого файла. Новый проект использует пути поиска по умолчанию. Возможно, потребуется изменить путь поиска включения, чтобы добавить каталог для проекта. При компиляции в командной строке добавьте путь к переменной среды INCLUDE или /I параметр компилятора, чтобы указать путь к файлу.

Чтобы задать путь к каталогу include в Visual Studio, откройте диалоговое окно страниц свойств проекта. Выберите каталоги VC++ в разделе «Свойства конфигурации » в левой области, а затем измените свойство Include Directoryies . Дополнительные сведения о каталогах для отдельных пользователей и проектов, искомых компилятором в Visual Studio, см. на странице свойств каталогов VC++. Дополнительные сведения о параметре /I компилятора см. в разделе /I (Дополнительные каталоги включения).

Среда INCLUDE или LIB командной строки не задана

Если компилятор вызывается из командной строки, для указания путей поиска часто используются переменные среды. Если путь поиска, описанный переменной среды INCLUDE или LIB , неправильно задан, может возникнуть ошибка C1083. Настоятельно рекомендуется использовать ярлык командной строки разработчика, чтобы задать базовую среду для сборок командной строки. Дополнительные сведения см. в разделе «Сборка C/C++ в командной строке». Дополнительные сведения об использовании переменных среды см. в разделе «Практическое руководство. Использование переменных среды в сборке».

Файл может быть заблокирован или использоваться

Если вы используете другую программу для редактирования или доступа к файлу, возможно, файл заблокирован. Попробуйте закрыть файл в другой программе. Иногда другая программа может быть самой Visual Studio, если вы используете параметры параллельной компиляции. Если параметр параллельной сборки отключает ошибку, это проблема. Эта проблема также может быть связана с другими параллельными системами сборки. Будьте внимательны, чтобы задать зависимости файлов и проектов, чтобы порядок сборки был правильным. В некоторых случаях рассмотрите возможность создания промежуточного проекта для принудительного порядка сборки зависимостей для общего файла, который может быть создан несколькими проектами. Иногда антивирусные программы временно блокируют недавно измененные файлы для сканирования. По возможности рекомендуется исключить каталоги сборки проекта из антивирусного сканера.

Включена неправильная версия имени файла

Ошибка C1083 также может указывать на включение неверной версии файла. Например, построение может включать неверную версию файла, содержащего директиву #include для файла заголовка, который не предназначен для данного построения. Например, некоторые файлы могут применяться только к сборкам x86 или к отладочным сборкам. Если файл заголовка не найден, компилятор выдает ошибку C1083. Для исправления этой проблемы необходимо использовать правильный файл, а не добавлять в построение файл заголовка или каталог.

Предкомпилированные заголовки еще не скомпилированы

Если проект настроен на использование предварительно скомпилированных заголовков, необходимо создать соответствующие .pch файлы, чтобы можно было скомпилировать файлы, использующие содержимое заголовка. Например, pch.cpp файл ( stdafx.cpp в Visual Studio 2017 и более ранних версиях) автоматически создается в каталоге проекта для новых проектов. Сначала необходимо скомпилировать этот файл, чтобы создать предкомпилированные файлы заголовков. В стандартной структуре процесса сборки это делается автоматически. Дополнительные сведения см. в разделе «Создание предварительно скомпилированных файлов заголовков».

Дополнительные причины

Вы установили пакет SDK или стороннюю библиотеку, но не открывали новое окно командной строки разработчика после установки пакета SDK или библиотеки. Если пакет SDK или библиотека добавляет файлы в путь INCLUDE , может потребоваться открыть новое окно командной строки разработчика, чтобы получить эти изменения переменной среды.

Файл использует управляемый код, но параметр /clr компилятора не указан. Дополнительные сведения см. в разделе /clr (компиляция среды CLR).

Файл компилируется с помощью другого /analyze параметра параметра компилятора, отличного от используемого для предварительной компиляции заголовков. При предварительной компиляции заголовков проекта все должны использовать одни и те же /analyze параметры. Дополнительные сведения см. в разделе /analyze (Анализ кода).

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

Файл, каталог или диск доступен только для чтения.

Visual Studio или программы командной строки не имеют достаточных разрешений для чтения файла или каталога. Это может произойти, например, если файлы проекта имеют другое право собственности, чем процесс, выполняемый в Visual Studio или программы командной строки. Иногда эту проблему можно устранить, запустив Visual Studio или командную строку разработчика от имени администратора.

Недостаточно дескрипторов файлов. Закройте часть приложений и повторите компиляцию. Эта ситуация маловероятна в обычных условиях. Однако она может возникать при построении крупных проектов на компьютере с ограниченной физической памятью.

Пример

В следующем примере возникает ошибка C1083, если файл «test.h» заголовка не существует в исходном каталоге или в пути поиска включения.

Сведения о сборке проектов C/C++ в интегрированной среде разработки или командной строке, а также о настройке переменных среды см. в разделе «Проекты» и «Системы сборки».

Источник

Error c1083 не удается открыть файл включение stdafx h no such file or directory

This forum has migrated to Microsoft Q&A. Visit Microsoft Q&A to post new questions.

Answered by:

Question

me all the time that error occurs, look after the forums but not found out what this is about

#include «stdafx.h»
#include
/*
#include

# define CLANOVI_OBITELJI 100
# define MJESECI 100

using namespace std;

int main() <
float dzeparci[CLANOVI_OBITELJI][MJESECI];
float dzeparci_po_clanu[CLANOVI_OBITELJI];
float dzeparci_po_mjesecu[MJESECI];

cout >br_clanova;
cout >br_mjeseci;

float zbroj_dzeparca=0;
for(int i=0; i
zbroj_dzeparca=0;
for(int j=0; j
zbroj_dzeparca += dzeparci[i][j];
>
dzeparci_po_clanu[i] = zbroj_dzeparca/br_mjeseci;
>

for(int i=0; i
zbroj_dzeparca=0;
for(int j=0; j
zbroj_dzeparca += dzeparci[j][i];
>
dzeparci_po_mjesecu[i] = zbroj_dzeparca/br_clanova;
>
cout

Источник

Для новичков про stdafx.h

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

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

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

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

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

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

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

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

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

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

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

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

  • Файл A: ,
  • Файл B: ,
  • Файл C: ,

Нужно делать отдельные 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» автоматически будет включаться в начало ВСЕХ компилируемых файлов. 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 раза полностью перекомпилировать весь проект — занятие неприятное. Плюс полная перекомпиляция потребуется всем вашим коллегам.

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

Зачем в одном проекте может понадобиться несколько 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

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 файлов естественно тоже должны различаться.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

Источник

Member.R


Ответов: 3


Я начал новую жизнь. ПУСТОЙ проект на visual studio и когда я писал

#include "stdafx.h"

это дало мне ошибку : не удается открыть исходный файл «stdafx.h»

Что я уже пробовал:

поэтому я перешел к заголовочным файлам -> Open -> existing Item -> и открыл stdfx.h из другого проекта , но все равно он выдал мне ту же ошибку . кто-нибудь может помочь ?


3 Ответов

Рейтинг:
17

Richard MacCutchan

Этот файл автоматически создается мастером создания нового проекта и используется компилятором для построения предварительно скомпилированного файла заголовков. В пустом проекте его не будет.


Рейтинг:
1

bala g ch

пожалуйста, покажите свой код..

Я думаю, что вы определили #include»afxwin.h», вот почему вы получаете ошибку.

вы должны определить в «afxwin.h» вместо


Member.R

О, Спасибо ! это сработало ^_^

Member 14781922

Текст вопроса
Напишите код C++ для функции с именем min(). Эта функция принимает два плавающих параметра num1 и num2 и возвращает минимум между ними.

Рейтинг:
0

VISWESWARAN1998

Насколько мне известно, это предварительно скомпилированный заголовочный файл, который помогает ускорить работу приложения C++. Обратите внимание на двойные кавычки «» там, что означает, что это добавленный пользователем заголовочный файл, как правило, заголовки будут находиться в <> и для добавленного пользователем заголовочного файла #include»расположение заголовочного файла» stdafx обычно добавляется компилятором в расположение проекта по умолчанию, а для пустого проекта компилятор вообще не будет создавать никаких файлов, поэтому вам нужно добавить новый элемент(заголовочный файл) с именем stdafx.h, чтобы приложение работало для вас. Помните, что это не ускорит работу приложения C++.

Правильный способ добавления stdafx.h-это упоминание использования предварительно скомпилированного заголовочного файла в настройках Вашего проекта.

Не стесняйтесь задавать любые вопросы


Member.R

большое вам спасибо ! теперь мне все ясно !

[no name]

Добро пожаловать!

Richard MacCutchan

Нет, он не ускоряет работу приложения и не добавляется компилятором.

[no name]

Сэр, насколько мне известно, предварительно скомпилированный заголовочный файл не будет компилироваться каждый раз, так что это ускорит процесс компиляции. Извините, сэр, я опубликовал приложение для ускорения, и до сих пор, насколько мне известно, я не знаю, правильно это или нет, я имею в виду, что это ускорит время компиляции или нет. И не могли бы вы дать правильный ответ на второй вопрос-это Visual Studio или что-то еще, что добавляет это? Спасибо, что уделили мне время, сэр. Прошу прощения за предоставление неверной информации

Richard MacCutchan

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

Понравилась статья? Поделить с друзьями:
  • Не удается открыть зип архив неверный формат как исправить
  • Не удается обновить виндовс 7 до 10 ошибка 0x80072f8f 0х20000
  • Не удается обновить айфон ошибка 4013
  • Не удается найти файл сценария c windows temp sg 71s31n5 ts 370b vbs как исправить
  • Не удается найти файл сценария c programdata windows profile 1 js как убрать ошибку