Por que quando crio uma classe c++ no visual studio 2013 a partir do assistente, não preciso incluir cabeçalhos de stdafx.h
-
21-12-2019 - |
Pergunta
Encontrei coisas curiosas que não consigo explicar.Quando eu uso o assistente de criação de classe no VS2013, ele cria arquivos .h e .cpp com base de classe definida.
Exemplo de arquivo de cabeçalho:
#pragma once
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
Então adicionei alguns usos.Incluí cabeçalhos com esses namespaces no stdafx.std e sf do SFML são usados no meu aplicativo:
#pragma once
using namespace std;
using namespace sf;
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
E tudo funciona bem.stdafx.h não está incluído no arquivo de cabeçalho, apenas em .cpp.
Mas então irei com a criação manual do arquivo de cabeçalho (sem .cpp) usando a mesma estrutura de classes:
#pragma once
using namespace std;
using namespace sf;
class SomeOtherClass
{
public:
SomeOtherClass();
~SomeOtherClass();
}
E não funciona.O VS diz que não consegue encontrar o namespace “sf”, mas não há problemas com o namespace “std”.
E é isso que eu quero saber:por que o primeiro caso é válido e o VS encontrou namespaces de cabeçalhos pré-compilados e o segundo caso não funciona.
Solução
Os arquivos de cabeçalho nunca são compilados sozinhos.Somente seu cpp
ou c
arquivos são compilados e os arquivos de cabeçalho são copiados neles pelo pré-processador quando você #include
eles.
Isso significa que se todos os seus arquivos cpp onde você inclui um cabeçalho tiverem seus namespaces antes a inclusão do cabeçalho, funcionará.Porque o compilador encontrará os namespaces antes de compilar o código do cabeçalho nesse arquivo.
Porém, não é uma boa prática.Um cabeçalho deve funcionar por conta própria e não depender do arquivo cpp para fazer algo antes da inclusão.