A cosa serve "stdafx.h" in Visual Studio?

Un file chiamato stdafx.h viene generato automaticamente quando avvio un progetto in Visual Studio 2010. Ho bisogno di fare una libreria C++ multipiattaforma, quindi non posso usare questo file di intestazione.

Per cosa viene usato stdafx.h? Va bene se rimuovo semplicemente questo file di intestazione?

Soluzione

Tutti i compilatori C++ hanno un serio problema di prestazioni da affrontare. Compilare il codice C++ è un processo lungo e lento.

Compilare le intestazioni incluse nei file C++ è un processo molto lungo e lento. Compilare le enormi strutture di intestazione che fanno parte delle API di Windows e di altre grandi librerie API è un processo molto, molto lungo e lento. Doverlo fare ancora, e ancora, e ancora per ogni singolo file sorgente Cpp è una campana a morto.

Questo non è unico per Windows, ma un vecchio problema affrontato da tutti i compilatori che devono compilare contro una grande API come Windows.

Il compilatore Microsoft può migliorare questo problema con un semplice trucco chiamato intestazioni precompilate. Il trucco è piuttosto astuto: anche se ogni file CPP può potenzialmente e legalmente dare un significato leggermente diverso alla catena di file header inclusi in cima ad ogni file Cpp (per cose come avere diverse macro #define'd prima degli include, o includendo gli header in ordine diverso), questo non è molto spesso il caso. Il più delle volte, abbiamo decine o centinaia di file inclusi, ma tutti sono destinati ad avere lo stesso significato per tutti i file Cpp che vengono compilati nella vostra applicazione.

Il compilatore può fare un enorme risparmio di tempo se non deve iniziare a compilare ogni file Cpp più le sue dozzine di include letteralmente da zero ogni volta.

Il trucco consiste nel designare un file header speciale come punto di partenza di tutte le catene di compilazione, il cosiddetto 'header precompilato'file, che è comunemente un file chiamato stdafx.h semplicemente per ragioni storiche.

Semplicemente elencate tutte le vostre grandi intestazioni per le vostre API nel vostro file stdafx.h, nell'ordine appropriato, e poi iniziate ogni vostro file CPP all'inizio con un #include "stdafx.h", prima di qualsiasi contenuto significativo (l'unica cosa permessa prima sono i commenti).

In queste condizioni, invece di partire da zero, il compilatore inizia la compilazione dai risultati già salvati della compilazione di tutto ciò che si trova in stdafx.h.

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

Per i compilatori Microsoft, l'impostazione che controlla l'uso degli header precompilati è controllata da un argomento della linea di comando al compilatore: /Yu "stdafx.h". Come puoi immaginare, l'uso del nome del file stdafx.h è semplicemente una convenzione; puoi cambiare il nome se lo desideri.

In Visual Studio 2010, questa impostazione è controllata dalla GUI cliccando con il tasto destro del mouse su un progetto CPP, selezionando 'Proprietà' e navigando fino a "Proprietà di configurazione\C/C++\Precompiled Headers". 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), questo non rende il tuo programma illegale; significa semplicemente che il tuo strumento compilerà tutto da zero ogni volta.

Se state creando una libreria senza dipendenze da Windows, potete facilmente commentare o rimuovere gli #include dal file stdafx.h. Non c'è bisogno di rimuovere il file di per sé, ma chiaramente potete anche farlo, disabilitando l'impostazione dell'intestazione precompilata sopra.

Commentari (16)

È un "file di intestazione precompilato" -- ogni intestazione che includi in stdafx.h è pre-processata per risparmiare tempo durante le successive compilazioni. Puoi leggere di più su di esso qui su MSDN.

Se stai costruendo un'applicazione multipiattaforma, seleziona "Empty project" quando crei il tuo progetto e Visual Studio non metterà nessun file nel tuo progetto.

Commentari (2)

Mi sono appena imbattuto in questo da solo, dato che sto cercando di creare un framework nudo e crudo, ma ho iniziato creando una nuova opzione Win32 Program in Visual Studio 2017. "stdafx.h" non è necessario e dovrebbe essere rimosso. Quindi puoi rimuovere lo stupido "stdafx.h" e "stdafx.cpp" che è nel tuo Solution Explorer così come i file dal tuo progetto. Al suo posto, dovrai mettere

#include 

invece.

Commentari (0)