Я нашел любопытную вещь, которую не могу объяснить.
Когда я использую мастер создания классов в 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», но нет проблем с пространством имен «std».
И это то, что я хочу знать: почему первый случай действителен, и VS обнаружил пространства имен из предварительно скомпилированных заголовков, а второй случай не работает.
Заголовочные файлы никогда не компилируются в одиночку. Только ваш cpp
или же c
файлы компилируются, а файлы заголовков копируются в них препроцессором, когда вы #include
их.
Это означает, что все ваши файлы cpp, в которые вы включаете заголовок, имеют ваши пространства имен до Включение заголовка, это будет работать. Потому что компилятор найдет пространства имен до компиляции кода заголовка в этом файле.
Это не хорошая практика, хотя. Заголовок должен работать сам по себе и не полагаться на файл cpp, чтобы сделать что-то перед включением.