Почему, когда я создаю класс C ++ в Visual Studio 2013 от Wizard, мне не нужно включать заголовки из Stdafx.h
-
21-12-2019 - |
Вопрос
Я нашел куряческую вещь, которую я не могу объяснить. Когда я использую мастер создания класса в VS2013, он создал бы меня файлы .h и .CPP с определенной базой класса.
Пример заголовка файл:
#pragma once
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
.
Тогда я добавил некоторые призывы.Я включил заголовки с этими пространствами имен в Stdafx.STD и SF от SFML используются в моем приложении:
#pragma once
using namespace std;
using namespace sf;
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
.
и все работает нормально.stdafx.h не включен в заголовочный файл, только в .CPP.
Но потом я пойду с ручным созданием заголовочного файла (без .CPP), используя тот же класс структуры:
#pragma once
using namespace std;
using namespace sf;
class SomeOtherClass
{
public:
SomeOtherClass();
~SomeOtherClass();
}
.
И это не работает.VS говорит, что не может найти пространство имен SF «SF», но проблем с пространством «std» нет.
И это то, что я хочу знать: почему первый случай действителен, и VS обнаружил пространства имен из предложенных заголовков и второго случая не работает.
Решение
Файлы заголовка никогда не скомпилированы в одиночку.Составлены только ваши файлы cpp
или c
, а файлы заголовка копируются в них препроцессором при их генеракодицетах.
Это означает, что все ваши файлы CPP, в которых вы включите заголовок, имеют ваши пространства имен до включения заголовка, он будет работать.Поскольку компилятор найдет пространства имен перед компиляцией кода заголовка в этом файле.
Это не очень хорошая практика, хотя.Заголовок должен работать над своим собственным, а не полагаться на файл CPP, чтобы сделать что-то до включения.