Pourquoi, lorsque je crée une classe C++ dans Visual Studio 2013 à partir de l'assistant, je n'ai pas besoin d'inclure les en-têtes de stdafx.h
-
21-12-2019 - |
Question
J'ai trouvé des curiosités que je ne peux pas expliquer.Lorsque j'utilise l'assistant de création de classe dans VS2013, cela me crée des fichiers .h et .cpp avec une base de classe définie.
Exemple de fichier d'en-tête :
#pragma once
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
Ensuite, j'ai ajouté quelques utilisations.J'ai inclus des en-têtes avec ces espaces de noms dans stdafx.std et sf de SFML sont utilisés dans mon application :
#pragma once
using namespace std;
using namespace sf;
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
Et tout fonctionne bien.stdafx.h n'est pas inclus dans le fichier d'en-tête, uniquement dans .cpp.
Mais ensuite, j'opterai pour la création manuelle du fichier d'en-tête (sans .cpp) en utilisant la même structure de classe :
#pragma once
using namespace std;
using namespace sf;
class SomeOtherClass
{
public:
SomeOtherClass();
~SomeOtherClass();
}
Et ça ne marche pas.VS dit qu'il ne trouve pas l'espace de noms "sf", mais il n'y a aucun problème avec l'espace de noms "std".
Et c'est ce que je veux savoir :pourquoi le premier cas est valide et VS a trouvé des espaces de noms à partir des en-têtes précompilés et le deuxième cas ne fonctionne pas.
La solution
Les fichiers d'en-tête ne sont jamais compilés seuls.Seulement votre cpp
ou c
les fichiers sont compilés et les fichiers d'en-tête y sont copiés par le préprocesseur lorsque vous #include
eux.
Cela signifie que si tous vos fichiers cpp dans lesquels vous incluez un en-tête ont vos espaces de noms avant l'inclusion de l'en-tête, cela fonctionnera.Parce que le compilateur trouvera les espaces de noms avant de compiler le code de l'en-tête dans ce fichier.
Ce n'est cependant pas une bonne pratique.Un en-tête doit fonctionner seul et ne pas s'appuyer sur le fichier cpp pour faire quelque chose avant l'inclusion.