我发现了我无法解释的古玩。 当我在 VS2013 中使用类创建向导时,它会为我创建具有定义类基础的 .h 和 .cpp 文件。
示例头文件:
#pragma once
class SomeClass
{
public:
SomeClass();
~SomeClass();
};
然后我添加了一些用法。我在 stdafx 中包含了带有这些 namespace 的 header 。 SFML 中的 std 和 sf 在我的应用中使用:
#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
时,预处理器将头文件复制到它们中。
这意味着,如果包含 header 的所有 cpp 文件在包含 header 之前都有您的 namespace ,它就会起作用。因为编译器会在编译该文件中的 header 代码之前找到命名空间。
但这不是好的做法。 header 应该独立工作,而不是依赖 cpp 文件在包含之前执行某些操作。
关于c++ - 为什么当我从向导在 Visual Studio 2013 中创建 C++ 类时,我不需要包含来自 stdafx.h 的 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25028808/