C ++命名空间约定

时间:2018-05-21 04:43:51

标签: c++ namespaces

我是C ++的新手。

我有一个包含以下内容的文件:

namespace A {
  namespace B {
     function foo() {
     }
  }
  function bar() {
  }
}

,另一个文件包含以下内容:

namespace A {
  namespace C {
     // Call foo() and bar() here.
  }
}

如果我想在命名空间C中调用foo和bar,我应该包含它们的绝对命名空间吗?

A::B::foo();
A::bar();

或者我不必包含名称空间A,因为它们都在A?

B::foo();
bar();

2 个答案:

答案 0 :(得分:2)

这是一个name lookup问题。

因此,如果你已经读过这篇文章,你就会知道Unqualified LookupQualified Lookup

之间的区别

很明显,不合格的查找在这里是有效的,但如果你想做一些明确的工作,你可以使用合格的查找。因此,当非限定查找有效时,限定查找始终有效。(如果可以使用限定查找)。

答案 1 :(得分:0)

只是一点点补充。正如Constructor所说,限定查找总是生成格式良好的代码,但该代码并不总能产生预期的结果。考虑这个消除歧义的例子

#include <iostream>

void foo(); 
void foo(float);

namespace Boo {
    using ::foo;
    void foo(int a) { std::cout << __PRETTY_FUNCTION__  << " is here!\n"; }
}

void foo() { std::cout << __PRETTY_FUNCTION__  << " is here!\n"; }
void foo(int a) { std::cout << __PRETTY_FUNCTION__  << " is here!\n"; }
void foo(float) { std::cout << __PRETTY_FUNCTION__  << " is here!\n"; }

using namespace Boo;

int main(int argc, char *argv[])
{
    foo();       // no error!
    Boo::foo();  // still same
    //foo(3); // aw, there are three of them. Bad, bad `using namespace`!
    Boo::foo(3); 
    Boo::foo(3.f); 
    return 0;
}

名称空间Boo将名称foo传播为Boo::foo。我们在命名空间声明后定义了foo(),但之前需要知道原型声明。

现在假设Boostdfoo原型与标准标题中的abssin类似,并以此方式声明。允许头部实现使用上面的技巧。重新定义标准名称空间中使用的名称的结果被描述为未确定,因为根据if using是否在实现中,程序将使用标准或用户定义的函数而不考虑限定名称。

TL; DR:合格查找的结果始终是正确的,但如果不遵守保留名称,则并不总是很明确。