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

时间:2013-02-02 05:45:27

标签: 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);

这对你来说有点奇怪吗? (即double :: log :: log)

1 个答案:

答案 0 :(得分:2)

我不知道为什么你在课堂上定义了枚举。如果您已将`命名空间专用于日志记录,则在命名空间中定义所有与日志记录相关的内容。所以我更喜欢这个:

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

希望有所帮助。