gpt4 book ai didi

c++ - 为什么头文件中需要命名空间?

转载 作者:行者123 更新时间:2023-11-27 23:18:13 25 4
gpt4 key购买 nike

我熟悉 namespace 的以下用法。

在头文件中(例如people.h)我描述了一个名字空间的接口(interface)。例如:

namespace people{
int getAge(str Name);
void setName(str Name);
}

然后在 people.cpp 中,我根据空间名称定义方法:

#include "people.h"
int people::getAge(str Name) {
something_1;
something_2;
}

void people::setName(str Name) {
something_1;
}

但是,在我看到的一个头文件中,除了namespace people 之外,还有其他 namespace 的接口(interface)(例如namespace dogs)。并且这些 namespace 未在 people.cpp 文件中定义。

因此,我假设(由于某些奇怪的原因)namespace dogs 的接口(interface)被放入 people.h 中,然后 namespace dog 是在“dogs.cpp”文件中定义。因此,换句话说,我假设在两个不同的 cpp 文件中定义了两个不同的 namespace ,但它们的接口(interface)在一个头文件中进行了描述。然而,这个假设似乎是错误的,因为我发现有很多头文件声明了“命名空间狗”。

所以,我假设 2people.h"文件中的 namespace dogs 有另一个功能,但我不知道它是什么功能。有人可以帮我吗?

已添加

我试图理解的代码不是我写的,但它运行良好。所以,这应该是有道理的。可能是我不够清楚。所以,我试着举个例子:

在头文件 (people.h) 中我有:

namespace etet
{
class date;
}

namespace xsystem{
class estimation_module;
}

namespace people {
a_lot_of_different_stuff;
}

然后 people.cpp 定义了属于 people 命名空间的所有方法。

最佳答案

“命名空间接口(interface)”是一个误导性的概念。命名空间只是一堆以姓氏组合在一起的名字(比如你​​和你的 sibling )。它没有“接口(interface)”,因为没有命名空间“obejct”。

#include "people.h"
int people::getAge(str Name) {
something_1;
something_2;
}

void people::setName(str Name) {
something_1;
}

完全等同于

#include "people.h"
namespace people
{
int getAge(str Name) {
something_1;
something_2;
}

void setName(str Name) {
something_1;
}
}

这可能是更熟悉的,也可能不是。事实上,头文件声明的函数不存在于 cpp 中,这仅意味着它们可能存在于另一个 cpp 中。

关于 namespace name { ..... } 声明可以在许多文件中重复,每个文件包含各种函数是完全正常的,因为 namespace关键字不声明对象。它只是组名。而且 - 事实上 - 说命名空间是“声明的”是一种常见的语言滥用。声明的是命名空间的名称。

并且在不同地方声明的不同名称可以属于同一个组。这没有什么神秘的。

你的词典让我觉得你混淆了 namespaceclassstruct

已添加:

经过您的澄清,a_lot_of_different_stuff 似乎包含使用 etet::datexsystem::estimation_module; 的声明

>

编译器必须知道此名称(并且只有名称),但 header 不能递归地包含相应的 header ,因为它们很可能已经包含 people.h

典型的“curculare 引用”问题,如 here , 但涉及不同的命名空间。

关于c++ - 为什么头文件中需要命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15090465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com