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


person CodingFeles    schedule 30.07.2014    source источник
comment
Плохая идея иметь using namespace X в заголовочных файлах. Это затрудняет повторное использование ваших заголовочных файлов.   -  person MSalters    schedule 30.07.2014


Ответы (1)


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

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

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

person nvoigt    schedule 30.07.2014
comment
С предварительно скомпилированными заголовками заголовок не должен работать сам по себе, но может полагаться на содержимое предварительно скомпилированного заголовка. И это доступно через .cpp - person MSalters; 30.07.2014