【问题标题】:Is it correct to have a variable with the same name as a namespace有一个与命名空间同名的变量是否正确
【发布时间】:2014-02-12 13:49:57
【问题描述】:

这样做是否正确? :

namespace name {
    int name;
}

void proc(int name)
{
    name::name = name;
}

int main()
{
    int name = name::name;   
    return 0;
}

它适用于 GCC。但这对标准编译器和其他编译器是否可行?

【问题讨论】:

  • 对吗?当然。容易明白?我会说不是。那些name::name = namename = name::name 行让我畏缩。
  • @Proxy:当它在一个名为 name() 的函数中返回一个 struct name 时更有意义。您可以通过减少源代码中唯一拼写的数量来避免拼写错误。与 Python 减少类型错误的方式相同。
  • @KerrekSB Python 会减少类型错误的数量吗?根据我的经验,它只会将此类错误的检测从编译时转移到运行时。
  • @KerrekSB 而且你肯定不希望有一个同名的函数和类型。为了解析 C++,您必须知道符号是否命名了类型或其他名称。

标签: c++ namespaces language-lawyer identifier


【解决方案1】:

是的,这没关系,我们需要看看范围解析运算符在这种情况下是如何工作的。如果我们查看 draft C++ standard 部分 3.4.3 Qualified name lookup 实际上有一个非常相似的例子,它说(emphasis mine):

如果嵌套名称说明符中的 :: 范围解析运算符前面没有 decltype 说明符,查找该名称之前的名称 :: 仅考虑其特化为类型的名称空间、类型和模板。如果找到的名称未指定命名空间或类、枚举或依赖类型,则程序格式错误。[ 示例:

class A {
public:
    static int n;
};

int main() {
    int A;
    A::n = 42; // OK
    A b; // ill-formed: A does not name a type
}

——结束示例]

【讨论】:

    【解决方案2】:

    是的,这样做完全没问题。 一旦代码/项目的规模变大,命名空间就是为了解决这类问题而设计的。

    Here 是了解 C++ 的好地方。

    【讨论】:

    猜你喜欢
    • 2012-08-26
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2011-11-10
    • 2010-12-20
    相关资源
    最近更新 更多