c++ - C++ 中命名空间和类之间的命名约定?

标签 c++ namespaces convention

<分区>

创建一个名为“snap”的库,我想要一个名为“log”的类,我把它放在一个子命名空间中。如果命名空间也是“日志”可以吗? (我知道它在技术上是可行的,我想知道正确的命名约定,你会怎么做?)

namespace snap
{
  namespace log
  {
    class log {
      ...
      enum log_level_t { ..., LOG_LEVEL_ERROR, ... };
      ...
    };
  }
}

问题是我们最终会遇到这样的事情:

snap::log::log::log_level_t ll(snap::log::log::LOG_LEVEL_ERROR);

你觉得这很奇怪吗? (即双::log::log)

最佳答案

我不知道你为什么要在类中定义枚举。如果你有一个专门用于日志记录的命名空间,那么在命名空间中定义所有与日志记录相关的东西。所以我更喜欢这个:

namespace snap
{
  namespace log
  {
     enum log_level_t { ..., LOG_LEVEL_ERROR, ... };
     class log { };
  }
}

此外,由于命名空间 log 本身意味着其中定义的内容与日志记录相关(或应该与日志记录相关),所以我觉得 log 部分在 log_level_t 中似乎是重复的。我会进一步将上述重构为:

namespace snap
{
  namespace logging //renamed
  {
     enum class level_t{verbose, info, error, ... }; //renamed, and used enum class!

     class logger { ... }; //renamed
  }
}

或者,我可能会选择名称 severity 而不是 level_t。无论如何,在我看来用法变得更好了:

logger.write(snap::logging::severity::error, message, etc);

或者你可以写一些友好的函数,这样你就可以这样写:

logger.verbose(message, etc);
logger.info(message, etc);
logger.error(message, etc);
//etc

希望对您有所帮助。

关于c++ - C++ 中命名空间和类之间的命名约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14659035/

相关文章:

c++ - C++的异步函数调用

c++ - 从数据库填充 QTreeView 作为父节点和子节点

xml - XML 命名空间的这种用法是否正确?

Python - 定义仅使用一次的常量变量的最便捷方式

linux - 我在 Linux 上的简单守护程序应该在哪个系统用户上默认运行以获得最佳兼容性?

utf-8 - utf8 和 utf-8 有什么区别?

c++ - 与对象互斥

c# - 如何从 c# 返回列表并通过 com 在 vc++ 中使用它

php - 一个临时编码解决方案,项目类可以在以后轻松升级到命名空间

namespaces - 库(插入符号)返回命名空间加载失败并且找不到对象 sigma