400

Lo stdafx.h viene generato automaticamente quando avvio un progetto in VS2010. Ho bisogno di creare una libreria C++ multipiattaforma, quindi non posso/non posso usare questo file di intestazione.A cosa serve "stdafx.h" in Visual Studio?

A cosa serve? Va bene che rimuovo questo file di intestazione?

+2

Se ottengo l'errore di compilazione relativo a stdafx.h, in genere imposto le impostazioni per non creare o utilizzare questo file .. – phoad

+2

Mi chiedo sempre lo stesso - con un colpo forte e arrabbiato sul pulsante di ritorno! – Bitterblue

+5

Articolo: StdAfx.h per Novizi - http://www.viva64.com/en/b/0265/ –

risposta

688

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

Le intestazioni di compilazione incluse nei file C++ sono un molto lungo, processo lento. Compilare le enormi strutture di intestazione che fanno parte dell'API di Windows e di altre librerie API di grandi dimensioni è un molto, molto lento, processo. Devo farlo finita, e ancora e ancora per ogni singolo file sorgente Cpp è una campana a morto.

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

Il compilatore Microsoft può migliorare questo problema con un semplice trucco chiamato intestazioni precompilate. Il trucco è piuttosto scorrevole: sebbene ogni file CPP possa potenzialmente e legalmente dare un significato leggermente diverso alla catena di file di header inclusa in cima a ogni file Cpp (con cose come avere diversi macro # definirli prima degli include, o includendo le intestazioni in ordine diverso), il più delle volte non è il caso. La maggior parte delle volte, abbiamo dozzine o centinaia di file inclusi, ma tutti hanno lo scopo di avere 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 include letteralmente da zero ogni volta.

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

Basta elencare tutte le tue enormi intestazioni per le tue API nel tuo file stdafx.h, nell'ordine appropriato, quindi avviare ciascuno dei tuoi file CPP in alto con uno #include "stdafx.h", prima di qualsiasi contenuto significativo (quasi l'unica cosa consentita prima sono i commenti).

In tali condizioni, anziché iniziare da zero, il compilatore inizia a compilare dai risultati già salvati di compilare tutto in stdafx.h.

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

Per i compilatori Microsoft, l'impostazione che controlla l'utilizzo delle intestazioni precompilate è controllata da un argomento della riga di comando per il 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 facendo clic con il pulsante destro del mouse su un progetto CPP, selezionando "Proprietà" e spostandosi su "Proprietà di configurazione \ C/C++ \ Intestazioni precompilate". Per le altre versioni di Visual Studio, la posizione nella GUI sarà diversa.

Si noti che se si disabilitano le intestazioni precompilate (o si esegue il progetto tramite uno strumento che non le supporta), ciò non rende il programma illegale; significa semplicemente che il tuo strumento compilerà tutto da zero ogni volta.

Se si sta creando una libreria senza dipendenze Windows, si può facilmente commentare o rimuovere #include dal file stdafx.h. Non è necessario rimuovere il file di per sé, ma è possibile farlo chiaramente, disabilitando l'impostazione dell'intestazione di precompilazione sopra.

+4

Anche se si utilizza solo per i file dallo spazio dei nomi std si ottiene un vantaggio di velocità – Ghita

+0

Questo funziona anche in Visual Studio 2012 – Dzyann

+9

omg, risposta molto bella infatti. Stavo cercando il compilatore c compatibile standard. si scopre che posso disabilitare le estensioni micro $ oft dalle proprietà del progetto, cambiare il compilatore da "auto" a "c" e il tuo è praticamente avere compilatore e IDE "standard". – docesam

36

È un "file di intestazione precompilato": qualsiasi intestazione inclusa in stdafx.h viene preelaborata per risparmiare tempo durante le compilazioni successive. Potete leggere di più su di esso here on MSDN.

Se si sta creando un'applicazione multipiattaforma, selezionare "Progetto vuoto" durante la creazione del progetto e Visual Studio non inserirà alcun file nel progetto.

+14

Non c'è niente in questo file che non funzioni 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. – detunized

+2

@detunized: Forse la mia risposta ha fatto sembrare il contrario, quindi grazie per aver chiarito questa parte. – casablanca

1

Mi sono imbattuto in questo da solo perché sto cercando di creare un framework barebone ma ho iniziato creando una nuova opzione di programma Win32 in Visual Studio 2017. "Stdafx.h" non è necessario e deve essere rimosso. Quindi puoi rimuovere lo stupido "Stdafx.h" e "stdafx.cpp" presente nel tuo Solution Explorer e anche i file del tuo progetto. Al suo posto, è necessario inserire

#include <Windows.h> 

invece.

1

"Non credo che questo trucco sia univoco per i compilatori Microsoft, né penso che sia stato uno sviluppo originale.", È corretto.

Ho incontrato per la prima volta le intestazioni precompilate con il compilatore C++ borland intorno al 1991/92 e non credo nemmeno che provenga da lì.

-Un altro sviluppo era/è un collegamento incrementale che ha aiutato a ridurre le dimensioni del codice collegando solo il codice di riferimento nell'eseguibile.

Altri modi per evitare di ricompilare il codice che non è stato riscritto o aggiornato, è dividere il progetto in molti file separati in cui solo i file modificati vengono ricompilati prima del collegamento, utilizzando make nei vecchi giorni prima di quelli grandi lenti l'ha fatto davvero.

+1

Questa non è una risposta a sé stante, ma un commento sulla risposta accettata. –