Для чого використовується “stdafx.h” у Visual Studio?


500

Файл з ім’ям stdafx.hавтоматично генерується, коли я запускаю проект у Visual Studio 2010. Мені потрібно створити міжплатформенну бібліотеку C ++, тому я не можу / не можу використовувати цей файл заголовка.

Для чого stdafx.hвикористовується? Чи добре, що я просто видаляю цей файл заголовка?


2
Якщо я отримую помилку компіляції, пов’язану з stdafx.h, я зазвичай встановлюю параметри не створювати та не використовувати цей файл ..
phoad

6
Стаття: StdAfx.h для новачків - viva64.com/uk/b/0265

Ви можете використовувати файл заголовка просто чудово на інших платформах, для них це просто звичайний файл заголовка. Тут просто немає користі для продуктивності.
Андреа

Відповіді:


826

Усі компілятори C ++ мають одну серйозну проблему з продуктивністю. Складання C ++ коду - довгий і повільний процес.

Складання заголовків, що містяться вгорі файлів C ++, - дуже довгий і повільний процес. Складання величезних структур заголовків, що входять до складу API Windows та інших великих бібліотек API - дуже , дуже довгий і повільний процес. Доводиться робити це знову і знову і знову для кожного окремого вихідного файлу Cpp - це смертна кала.

Це не тільки для Windows, але стара проблема, з якою стикаються всі компілятори, яким доводиться компілювати такі великі API, як Windows.

Компілятор Microsoft може покращити цю проблему простим трюком, який називається попередньо складеними заголовками . Трюк досить гладкий: хоча кожен CPP-файл може потенційно та юридично надати рівномірно різний зміст ланцюгу файлів заголовків, що містяться вгорі кожного файлу Cpp (такими як, наприклад, різні макроси # define'd перед включеними, або шляхом включення заголовків у різному порядку), найчастіше це не так. Здебільшого у нас є десятки або сотні файлів, що включаються, але всі вони мають однакове значення для всіх файлів Cpp, що складаються у вашій програмі.

Компілятор може зробити величезну економію часу, якщо не потрібно починати компілювати кожен файл Cpp плюс його десятки включає буквально з нуля кожен раз.

Трюк полягає у призначенні спеціального файлу заголовка як вихідного пункту всіх ланцюгів компіляції, так званого файлу "попередньо складеного заголовка", який, як правило, є файлом з назвою stdafx.h просто з історичних причин.

Просто перелічіть усі ваші великі величезні заголовки для ваших API у вашому файлі stdafx.h у відповідному порядку, а потім запустіть усі ваші CPP-файли в самій вершині #include "stdafx.h", перед будь-яким змістовним вмістом (майже про єдине, що дозволено раніше, це коментарі).

За цих умов компілятор замість того, щоб починати з нуля , починає компілювати з уже збережених результатів компіляції всього в stdafx.h.

Я не вірю, що цей трюк є унікальним для компіляторів Microsoft, і не думаю, що це був оригінальний розвиток.

Для компіляторів Microsoft, параметр , який наглядає за використанням прекомпілірованние заголовки управляються з допомогою аргументу командного рядка може використовувати компілятор /Yu "stdafx.h". Як ви можете собі уявити, використання імені stdafx.hфайлу - це просто умова; ви можете змінити ім'я, якщо цього хочете.

У Visual Studio 2010 цим параметром керує GUI за допомогою клацання правою кнопкою миші на проекті CPP, вибору "Властивості" та переходу до "Властивості конфігурації \ C / C ++ \ Попередньо складені заголовки". Для інших версій Visual Studio розташування в GUI буде іншим.

Зауважте, що якщо ви відключите попередньо складені заголовки (або запускаєте проект через інструмент, який не підтримує їх), це не робить вашу програму незаконною; це просто означає, що ваш інструмент буде збирати все з нуля кожного разу.

Якщо ви створюєте бібліотеку без залежностей від Windows, ви можете легко прокоментувати або видалити #includes з stdafx.hфайлу. Немає необхідності видаляти файл сам по собі, але очевидно, що ви можете це зробити, відключивши налаштування заголовка прекомпіляції вище.


6
Навіть якщо ви використовували лише файли з простору імен std, ви отримуєте
швидку

11
omg, дуже приємна відповідь на справді. Я шукав стандартний компілятор c. виявляється, що я можу відключити розширення micro $ oft з властивостей проекту, змінити компілятор з "auto" на "c", і у вас в значній мірі є "стандартний" компілятор та IDE.
EKanadily

4
@ Rishi: "Ви маєте на увазі під рядком" #include "stdafx.h"? Звичайно, але це просто стандартний #include. Частина "Розширення MS" - це лише оптимізація продуктивності компілятора; це не змінює семантику наявності файлу заголовка, який називається "stdafx.h". Зауважте, що якщо ви вилучите include і ваш код залежать від усього, що було включено через stdafx.h, вам доведеться включити його безпосередньо.
Euro Micelli

4
@ Youda008, не зовсім правда. Перш ніж компілювати файл коду, вміст заголовків просто та буквально «вставляється» на місце, де ви #includeїх знаходитесь у вихідному файлі (виконується тим же кроком «препроцесора», що оцінює макроси). Потім отриманий загальний файл передається фактичному компілятору, який ніколи не бачить файл заголовка як окрему сутність. Ви розміщуєте декларації лише у файлі заголовка, тому що це добре працює у файлі заголовка - це звичайне правило. Спробуй це! Створіть файл заголовка з усією програмою, а потім створіть вихідний файл, у якому є лише #include. Це складено штрафу.
Euro Micelli

28
Історична цікавість. Назва stdafx.h походить приблизно з 1992 року, коли MFC до його виходу називався "Application Framework Extensions". Visual Studio 2015 все ще за замовчуванням має назву ..
kert

48

Це "попередньо компільований файл заголовка" - будь-які заголовки, які ви включаєте в stdafx.h, попередньо обробляються, щоб заощадити час під час наступних компіляцій. Детальніше про це ви можете прочитати тут на MSDN .

Якщо ви створюєте міжплатформенну програму, встановіть прапорець "Порожній проект" під час створення проекту, і Visual Studio взагалі не буде містити файлів у вашому проекті.


15
У цьому файлі немає нічого, що не працювало б на інших платформах. Це може уповільнити компіляцію там, якщо компілятор не підтримує попередньо складені заголовки, але він не повинен порушувати його. Це просто заголовок, який включає інші файли заголовків.
детунізований

2
@detunized: Можливо, моя відповідь звучала інакше, тож дякую за уточнення цієї частини.
casablanca

3

"Stdafx.h" - це заздалегідь складений заголовок. Він включає файл для стандартних системних файлів, а для конкретних проектів включають файли, які часто використовуються, але змінюються нечасто. Це скорочує час компіляції та непотрібну обробку.

Попередньо складений заголовок stdafx.h в основному використовується в Microsoft Visual Studio, щоб повідомити компілятору про файли, які колись компілюються, і не потрібно компілювати його з нуля. Ви можете прочитати більше про це

http://www.cplusplus.com/articles/1TUq5Di1/

https://docs.microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017


-10

Я просто натрапив на це сам, оскільки намагаюся створити собі рамку з голими кістками, але почав, створивши новий варіант програми Win32 у Visual Studio 2017. "stdafx.h" непотрібний і його слід видалити. Тоді ви можете видалити дурні "stdafx.h" і "stdafx.cpp", які є у вашому Провіднику рішень, а також файли з вашого проекту. На своє місце вам потрібно буде поставити

#include <Windows.h>

замість цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.