【问题标题】:Combine two or more C++ namespaces into one将两个或多个 C++ 命名空间合并为一个
【发布时间】:2012-12-28 06:33:38
【问题描述】:

首先,对不起我的英语。

好的,我正在开发一个执行特定进程的程序。这个过程需要定义一些类和函数。所有这些都必须以块的形式组织起来才能访问它们。

我的第一个想法是使用命名空间 (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 和@987654339 @宏来防止多次导入),我正在使用这样的东西:

# ifndef LOAD_SYSTEM_H_
# define LOAD_SYSTEM_H_

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

# endif

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

【问题讨论】:

  • 据我所知,这是使用命名空间的完全正确的方式。您可以拥有许多并并行使用它们,没问题。 (我不知道你是否真的需要所有这些命名空间;如果不了解所有类的作用以及它们的使用方式,就很难判断。)
  • 你的英语很好。我做了一些小的编辑以使其流畅和格式化。
  • jogojapan:谢谢,我终于(阅读答案)明白这个“组合”的过程不是一个错误。谢谢。 wallyk:嗯,设计指定了一些逻辑架构,所以,我想我必须尝试在代码上表示该架构:P,但是阅读这里的答案,并更多地考虑命名空间的情况和性质,我想我会管理只有一个级别:P(程序的名称,类似于 MySystem::Class1、MySystem::Class2 等)。

标签: c++ namespaces combinations


【解决方案1】:

你总是可以扩展一个现有的命名空间,这样那部分就可以了。

而这部分是唯一有简单技术答案的部分。

关于“主头文件”,比较主观,看个人喜好。我更喜欢包含的标题可以在没有任何先决条件的情况下自行包含(例如在它们之前包含其他内容)。如果是这样,那么对我来说一切都好,但如果不是,那么您的代码的用户实际上必须包含大的主头文件才能获得任何较小的头文件,这可能会对构建时间产生负面影响(如果他们不这样做't,但它们本身包含先决条件,然后它们的代码很脆弱,当您更新标头时可能会停止工作)。

【讨论】:

  • 非常感谢您的回答。正如我上面所说,我现在将尝试只使用一层命名空间(程序名称)。是的,我知道将大量标头导入代码文件会影响编译时间,也可能会影响二进制大小。因此,我将尝试使用直接导入调用(导入类文件而不是主头文件)。感谢您的帮助:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 2014-05-20
  • 2022-06-20
  • 1970-01-01
相关资源
最近更新 更多