¿Por qué cuando creo una clase de c++ en visual studio 2013 de asistente no necesito incluir los encabezados de stdafx.h
-
21-12-2019 - |
Pregunta
He encontrado curiosidades cosa que no puedo explicar.Cuando yo uso la clase asistente de creación en VS2013 crearía mí .h and .archivos cpp definidas con base a la clase.
Ejemplo de archivo de encabezado:
#pragma once
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
Luego he añadido algunos utilizan.He incluido los encabezados con estos espacios de nombres en stdafx.enfermedades de transmisión sexual y sf de SFML se utilizan en mi app:
#pragma once
using namespace std;
using namespace sf;
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
Y todo funciona bien.stdafx.h no está incluido en el archivo de encabezado, sólo en .cpp.
Pero, a continuación, voy a ir con manual de creación de archivo de encabezado(sin .cpp) utilizando la misma estructura de la clase:
#pragma once
using namespace std;
using namespace sf;
class SomeOtherClass
{
public:
SomeOtherClass();
~SomeOtherClass();
}
Y no funciona.VS dice que no puede encontrar "sf" espacio de nombres, pero no hay problemas con la "std" espacio de nombres.
Y eso es lo que quiero saber:¿por qué el primer caso es válido y VS se han encontrado espacios de nombres de los encabezados precompilados y segundo caso no funciona.
Solución
Archivos de encabezado nunca compilado solo.Sólo su cpp
o c
se compilan los archivos y los archivos de cabecera se copian a ellos por el preprocesador cuando #include
ellos.
Eso significa que si todos los archivos cpp donde se incluyen una cabecera tiene sus espacios de nombres antes de la inclusión de la cabecera, va a trabajar.Debido a que el compilador de encontrar los espacios de nombres antes de compilar el código de la cabecera en el archivo.
No es buena práctica, aunque.Un encabezado debe trabajar en su propia y no depender de el archivo cpp hacer algo antes de que la incluyen.