我发现了一些我无法解释的奇怪的东西。当我在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文件在include之前做一些事情。