Perché quando creo una classe C++ in Visual Studio 2013 dalla procedura guidata non ho bisogno di includere intestazioni da stdafx.h
-
21-12-2019 - |
Domanda
Ho trovato una cosa curiosa che non riesco a spiegare.Quando utilizzo la procedura guidata per la creazione di classi in VS2013, mi creerebbe file .h e .cpp con una base di classe definita.
File di intestazione di esempio:
#pragma once
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
Poi ho aggiunto alcuni usi.Ho incluso le intestazioni con questi spazi dei nomi in stdafx.std e sf da SFML sono utilizzati nella mia app:
#pragma once
using namespace std;
using namespace sf;
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
E tutto funziona bene.stdafx.h non è incluso nel file di intestazione, solo in .cpp.
Ma poi procederò con la creazione manuale del file di intestazione (senza .cpp) utilizzando la stessa struttura di classe:
#pragma once
using namespace std;
using namespace sf;
class SomeOtherClass
{
public:
SomeOtherClass();
~SomeOtherClass();
}
E non funziona.VS dice che non riesce a trovare lo spazio dei nomi "sf", ma non ci sono problemi con lo spazio dei nomi "std".
E questa è la cosa che voglio sapere:perché il primo caso è valido e VS ha trovato spazi dei nomi da intestazioni precompilate e il secondo caso non funziona.
Soluzione
I file di intestazione non vengono mai compilati da soli.Solo il tuo cpp
O c
i file vengono compilati e i file di intestazione vengono copiati al loro interno dal preprocessore quando si #include
loro.
Ciò significa che tutti i tuoi file cpp in cui includi un'intestazione hanno i tuoi spazi dei nomi Prima l'inclusione dell'intestazione, funzionerà.Perché il compilatore troverà gli spazi dei nomi prima di compilare il codice dell'intestazione in quel file.
Non è una buona pratica però.Un'intestazione dovrebbe funzionare da sola e non fare affidamento sul file cpp per fare qualcosa prima dell'inclusione.