Почему, когда я создаю класс c ++ в Visual Studio 2013 из мастера, мне не нужно включать заголовки из stdafx.h

Я нашел любопытную вещь, которую не могу объяснить.
Когда я использую мастер создания классов в 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 обнаружил пространства имен из предварительно скомпилированных заголовков, а второй случай не работает.

2

Решение

Заголовочные файлы никогда не компилируются в одиночку. Только ваш cpp или же c файлы компилируются, а файлы заголовков копируются в них препроцессором, когда вы #include их.

Это означает, что все ваши файлы cpp, в которые вы включаете заголовок, имеют ваши пространства имен до Включение заголовка, это будет работать. Потому что компилятор найдет пространства имен до компиляции кода заголовка в этом файле.

Это не хорошая практика, хотя. Заголовок должен работать сам по себе и не полагаться на файл cpp, чтобы сделать что-то перед включением.

1

Другие решения


По вопросам рекламы [email protected]