【问题标题】:When I should use my own namespaces?什么时候应该使用自己的命名空间?
【发布时间】:2015-10-27 05:42:45
【问题描述】:

首先,我无法理解 C++ 标准库或 std 的结构。例如,“你好,世界!”程序看起来像这样:

#include <iostream>

int main() {
    std::cout << "Hello, world!" << std::endl;
}

用于生成随机数和执行时间评估的更复杂的程序如下所示:

#include <iostream>
#include <random>
#include <chrono>
#include <time.h>

int main() {
    std::chrono::time_point<std::chrono::system_clock> start, end;
    std::tr1::default_random_engine eng(static_cast<unsigned int>(time(NULL)));
    std::tr1::uniform_int<int> unif(0, 99);

    start = std::chrono::system_clock::now();

    for (int i = 0; i < 10; i++) {
        for (int j = 0; j < 10; j++) {
            std::cout << unif(eng) << " ";
        }

        std::cout << std::endl;
    }

    end = std::chrono::system_clock::now();

    int elapsed_milliseconds = std::chrono::duration_cast<std::chrono::milliseconds> (end - start).count();

    std::cout << "Elapsed time: " << elapsed_milliseconds << "ms" << std::endl;

    std::cin.get();
    return 0;
}

我的意见是这样的代码:

std::tr1::uniform_int<int> unif(0, 99);

或者这个:

std::chrono::time_point<std::chrono::system_clock> start, end;

看起来很丑。当然我可以使用这样的东西:

using namespace std;
using namespace std::tr1;
using namespace std::chrono;

但是这段代码可能会导致一些问题:Why is "using namespace std" considered bad practice?

我无法理解在标准库中创建嵌套命名空间的原因。与名称功能冲突有关的原因只有一个吗?还是别的什么?

对于我自己的项目,我什么时候应该使用自己的命名空间?

【问题讨论】:

  • 如果你使用 C++11,你不需要std::tr1,因为TR1 被合并了。
  • @rici 是的,它可以在没有std::tr1 的情况下工作。我以前不知道这一点。

标签: c++ c++11 namespaces


【解决方案1】:

命名空间是一个逻辑组。没有任何使用命名空间的规则。您可以使用或不使用命名空间。但这都是关于组织代码、库或 API 的。阅读本文以了解“Herb Sutter”http://www.gotw.ca/publications/mill08.htm

的一些最佳实践

您也可以使用using namespace std; 来打开命名空间。没有任何规则说不能。但所有这些都是关于为下一个程序员编写良好实践的代码,以使理解变得简单并保持易于维护。

您可以为您的程序使用一个或多个命名空间,特别是如果您正在创建一个 API 或库以在公众中分发。

它还有助于在大型程序中保持模块分离。并允许程序员在没有依赖的情况下工作。

认为 Google 有两个针对网络和移动设备的 UI 团队。他们可以为代码模块使用单独的命名空间

Google:Web:UIGoogle:Mobile:UI

即使它们可以进一步扩展为

Google:Web:UI:controlsGoogle:Mobile:UI:controls

或者他们可以使用

Google:controls:Web:UIGoogle:controls:Mobile:UI

这是按照他们的意愿、舒适度和他们认为的好方法来组织的。但可以有更好的方法。

STDLIB 也是如此。开发人员创建命名空间结构来组织模块。但这可能不是完美的方式。但你必须使用它。 如果你不喜欢你可以给它起别名http://en.cppreference.com/w/cpp/language/namespace_alias

如果您要创建程序。阅读其他 s 如何使用。特别流行的 C++ 项目,如 Linux boost 等。下载代码并查看。如果你的程序真的很简单,你可能不需要太在意。但始终阅读并保持良好的做法(阅读本书了解更多信息)。 http://www.gotw.ca/publications/c++cs.htm

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2011-01-16
    • 2023-04-02
    • 2011-04-15
    相关资源
    最近更新 更多