2

我发现了我无法解释的古玩。当我在 VS2013 中使用类创建向导时,它会为我创建具有已定义类基础的 .h 和 .cpp 文件。

头文件示例:

#pragma once

class SomeClass
{
public:
    SomeClass();
    ~SomeClass();
};

然后我添加了一些用法。我在 stdafx 中包含了带有这些命名空间的标头。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 已经从预编译的头文件中找到了命名空间,而第二种情况不起作用。

4

1 回答 1

1

头文件永远不会单独编译。只有你的cpporc文件被编译,并且头文件被预处理器复制到它们中#include

这意味着如果包含标头的所有 cpp 文件在包含标头之前都具有名称空间,那么它将起作用。因为编译器会在编译该文件中的标头代码之前找到命名空间。

虽然这不是一个好习惯。标头应该独立工作,而不是依赖 cpp 文件在包含之前执行某些操作。

于 2014-07-30T04:49:50.553 回答