A cosa serve “stdafx.h” utilizzato in Visual Studio?


500

Un file denominato stdafx.hviene generato automaticamente quando avvio un progetto in Visual Studio 2010. Ho bisogno di creare una libreria C ++ multipiattaforma, quindi non posso / non posso usare questo file di intestazione.

A cosa stdafx.hserve? Va bene che rimuovo questo file di intestazione?


2
Se ricevo un errore di compilazione relativo a stdafx.h, in genere imposto le impostazioni in modo da non creare o utilizzare questo file.
phoad,

6
Articolo: StdAfx.h per i principianti

Puoi usare il file header bene su altre piattaforme, per loro è solo un normale file header. Qui non offre alcun vantaggio in termini di prestazioni.
Andrea,

Risposte:


826

Tutti i compilatori C ++ hanno un grave problema di prestazioni da affrontare. La compilazione del codice C ++ è un processo lungo e lento.

La compilazione delle intestazioni incluse nella parte superiore dei file C ++ è un processo molto lungo e lento. La compilazione delle enormi strutture di intestazione che fanno parte dell'API di Windows e di altre librerie di API di grandi dimensioni è un processo molto , molto lungo e lento. Dover farlo ancora e ancora, e ancora e ancora per ogni singolo file sorgente di Cpp è una morte.

Questo non è univoco per Windows ma un vecchio problema affrontato da tutti i compilatori che devono compilare contro un'API di grandi dimensioni come Windows.

Il compilatore Microsoft può migliorare questo problema con un semplice trucco chiamato intestazioni precompilate . Il trucco è piuttosto semplice: anche se ogni file CPP può potenzialmente e legalmente dare un significato leggermente diverso alla catena di file di intestazione inclusa in cima a ciascun file Cpp (per cose come avere macro diverse # definite prima delle inclusioni, o includendo le intestazioni in ordine diverso), spesso non è così. Il più delle volte, abbiamo dozzine o centinaia di file inclusi, ma tutti hanno lo stesso significato per tutti i file Cpp che vengono compilati nella tua applicazione.

Il compilatore può fare enormi risparmi di tempo se non deve iniziare a compilare ogni file Cpp più le sue dozzine di inclusioni letteralmente da zero ogni volta.

Il trucco consiste nel designare uno speciale file di intestazione come punto di partenza di tutte le catene di compilation, il cosiddetto file di "intestazione precompilata", che è comunemente un file chiamato stdafx.h semplicemente per ragioni storiche.

Elenca semplicemente tutte le tue grandi enormi intestazioni per le tue API nel tuo file stdafx.h, nell'ordine appropriato, quindi avvia ciascuno dei tuoi file CPP in alto con un #include "stdafx.h", prima di qualsiasi contenuto significativo (quasi l'unica cosa consentita prima è Commenti).

In queste condizioni, invece di ricominciare da capo , il compilatore inizia la compilazione dai risultati già salvati della compilazione di tutto stdafx.h.

Non credo che questo trucco sia unico per i compilatori Microsoft, né penso che sia stato uno sviluppo originale.

Per compilatori Microsoft, l'impostazione che controlla l'utilizzo di intestazioni precompilate è controllato da una riga di comando argomento al compilatore: /Yu "stdafx.h". Come puoi immaginare, l'uso del stdafx.hnome del file è semplicemente una convenzione; puoi cambiare il nome se lo desideri.

In Visual Studio 2010, questa impostazione è controllata dalla GUI facendo clic con il pulsante destro del mouse su un progetto CPP, selezionando "Proprietà" e navigando su "Proprietà di configurazione \ C / C ++ \ Intestazioni precompilate". Per altre versioni di Visual Studio, la posizione nella GUI sarà diversa.

Nota che se disabiliti le intestazioni precompilate (o esegui il tuo progetto attraverso uno strumento che non le supporta), non renderà illegale il tuo programma; significa semplicemente che il tuo strumento compilerà ogni volta tutto da zero.

Se stai creando una libreria senza dipendenze di Windows, puoi facilmente commentare o rimuovere #includes dal stdafx.hfile. Non è necessario rimuovere il file in sé, ma chiaramente è possibile farlo anche disabilitando l'impostazione dell'intestazione precompilata sopra.


6
Anche se hai usato solo i file dallo spazio dei nomi standard, ottieni un vantaggio in termini di velocità
Ghita,

11
omg, davvero una bella risposta. Stavo cercando un compilatore c conforme allo standard. si scopre che posso disabilitare le estensioni micro $ oft dalle proprietà del progetto, cambiare il compilatore da "auto" a "c" e hai praticamente compilatore e IDE "standard".
EKanadily,

4
@Rishi: per 'linea', vuoi dire #include "stdafx.h"? Certo, ma questo è solo un #include standard. La parte "Estensione MS" è solo un'ottimizzazione delle prestazioni del compilatore; non cambia la semantica di avere un file header che si chiama "stdafx.h". Nota che se rimuovi l'inclusione e il tuo codice dipende da tutto ciò che è stato incluso tramite stdafx.h, dovrai includerlo direttamente.
Euro Micelli,

4
@ Youda008, non del tutto vero. Prima di compilare un file di codice, i contenuti delle intestazioni vengono semplicemente e letteralmente "incollati" nel punto in cui #includeli si trova nel file di origine (fatto dallo stesso passaggio 'preprocessore' che valuta le macro). Il file totale risultante viene quindi passato al compilatore effettivo, che non vede mai un file di intestazione come entità separata. Metti solo dichiarazioni nel file di intestazione perché è quello che funziona bene in un file di intestazione: è una regola convenzionale. Provalo! Crea un file header con un intero programma, quindi crea un file sorgente che contenga solo #include. Si compila bene.
Euro Micelli,

28
Curiosità storica. Il nome di stdafx.h risale al 1992, quando MFC era chiamato "Estensioni del framework applicativo" prima della sua uscita. Visual Studio 2015 utilizza ancora il nome predefinito ...
kert

48

È un "file di intestazione precompilato": tutte le intestazioni incluse in stdafx.h sono preelaborate per risparmiare tempo durante le successive compilazioni. Puoi leggere di più qui su MSDN .

Se stai creando un'applicazione multipiattaforma, seleziona "Svuota progetto" quando crei il tuo progetto e Visual Studio non inserirà alcun file nel tuo progetto.


15
Non c'è nulla in questo file che non funzionerebbe su altre piattaforme. Potrebbe rallentare la compilazione lì, se il compilatore non supporta le intestazioni precompilate, ma non dovrebbe romperlo. È solo un file di intestazione che include altri file di intestazione.
detunizzato il

2
@detunized: forse la mia risposta ha fatto sembrare diversamente, quindi grazie per aver chiarito quella parte.
Casablanca,

3

"Stdafx.h" è un'intestazione precompilata che include file per file di sistema standard e per file di progetto specifici che vengono utilizzati di frequente ma che vengono modificati di rado, riducendo i tempi di compilazione e l'elaborazione non necessaria.

L'intestazione precompilata stdafx.h viene sostanzialmente utilizzata in Microsoft Visual Studio per comunicare al compilatore i file che sono stati compilati una volta e non è necessario compilarli da zero. Puoi leggere di più a riguardo

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

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


-10

Mi sono imbattuto in questo da solo poiché sto cercando di crearmi un framework bare bones ma ho iniziato creando una nuova opzione del programma Win32 in Visual Studio 2017. "stdafx.h" non è necessario e dovrebbe essere rimosso. Quindi è possibile rimuovere gli stupidi "stdafx.h" e "stdafx.cpp" presenti in Esplora soluzioni, nonché i file dal progetto. Al suo posto, dovrai metterlo

#include <Windows.h>

anziché.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.