将两个或多个C++命名空间合并为一个

5
首先,抱歉我的英语不好。
好的,我正在编写一个执行特定进程的程序。这个进程需要定义一些类和函数。所有这些都必须组织成块以便访问它们。
我的第一个想法是使用命名空间(C ++),以获得这样的结果:
namespace LoadSystem
{
   namespace ParseBlock1
   {
      class ClassA {...}
      class ClassB {...}
      class ClassC {...}
   }
   namespace ParseBlock2
   {
      class ClassA {...}
      class ClassB {...}
      class ClassC {...}
   }
}

因此,我在阅读中得出最好的想法是否这个是好的。我已经阅读到不应该使用大量嵌套的命名空间,因此,对于我的目的,最小级别为两个,如上所示。

我的目标是能够将更多的ParseBlocks添加到LoadSystem命名空间中。它将存储在单个.h文件中,因此只会有类的接口。由于每个块可能有很多类,我想将每个块的定义拆分到其他.h文件中,以尽可能保持主.h文件的小巧。

因此,我想到了定义一个block1.hblock2.h文件,每个文件都有像这样的结构:

namespace LoadSystem
{
   namespace ParseBlock1
   {
      class ClassA {...}
      class ClassB {...}
      class ClassC {...}
   }
}

并且

namespace LoadSystem
{
   namespace ParseBlock2
   {
      class ClassA {...}
      class ClassB {...}
      class ClassC {...}
   }
}

load_system.h文件中导入它们。每次添加另一个块时,我编写所需的文件,最后只需将新的blockX.h导入主load_system.h即可。
然后,我必须能够使用LoadSystem::ParseBlock1::Class1LoadSystem::ParseBlock2::Class1从同一命名空间访问两个块。
我已经测试过这个简单的整数值并且它有效。名称空间组合在一起,我可以访问值而没有任何警告(我使用了gcc -Wall -Werror -Wextra -pedantic)。
那么,这种名称空间组合是正确的还是不正确的?也许它可以工作,但我可能不应该使用它,我不知道。
此外,我想知道导入“主”头文件(导入其他头文件)的这个过程是否正确(我使用所需的#ifndef#define#endif宏来防止多次导入),我正在使用类似于这样的东西:
# ifndef LOAD_SYSTEM_H_
# define LOAD_SYSTEM_H_

# include "block1/block1.h"
# include "block2/block2.h"

# endif

所以,请帮我确认这是否正确。

2
据我所知,这是使用命名空间的完全正确的方式。你可以拥有多个并行地使用它们,毫无问题。(我不知道的是你是否真的需要所有这些命名空间;如果不理解所有类别及其使用方式,很难判断。) - jogojapan
1
你的英语非常好。我进行了一些小的编辑,以使其更加流畅,并且格式更加整齐。 - wallyk
jogojapan: 谢谢,我终于(通过阅读答案)明白这个“组合”过程不是一个错误。谢谢。wallyk: 嗯,设计规定了一些逻辑架构,所以我认为我必须尝试在代码中表示那个架构:P,但是在这里阅读答案并更深入地思考命名空间的情况和性质后,我想我只能管理一个级别:P(程序名称,例如MySystem :: Class1,MySystem :: Class2等)。 - Moises Chavez
1个回答

2
你可以随时扩展现有的命名空间,所以这部分是没问题的。
这也是唯一拥有简单技术答案的部分。
关于“主头文件”,这更多是主观的,是个人偏好的问题。我更喜欢被包含的头文件可以独立地被包含,没有任何前提条件(如在它们之前包含其他东西)。如果是这样,那么对我来说一切都很好,但如果不是,那么你的代码用户在实践中就必须包含大的主头文件才能获得任何小的较小的头文件,这可能会对构建时间产生负面影响(如果他们不这样做,而是自己包含前提条件,那么当您更新一个头文件时,他们的脆弱代码可能会停止工作)。

非常感谢您的回答。正如我之前所说,我现在将尝试仅使用一个命名空间级别(程序名称)进行工作。是的,我明白在代码文件中导入大量头文件会影响编译时间,也可能影响二进制文件大小。因此,我将尝试使用直接导入调用(导入类文件而不是主头文件)进行工作。感谢您的帮助:D - Moises Chavez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接