拥有与命名空间同名的变量是否正确

时间:2014-02-12 13:49:58

标签: c++ namespaces language-lawyer identifier

这样做是否正确? :

namespace name {
    int name;
}

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

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

它适用于GCC。但是对于标准编译器和其他编译器来说这样可以吗?

2 个答案:

答案 0 :(得分:4)

是的,没关系,我们需要了解范围解析运算符在此上下文中的工作原理。如果我们查看draft C++ standard部分3.4.3 合格的名称查找实际上有一个非常类似的示例,它说(强调我的):

  

如果嵌套名称说明符中的:: scope resolution运算符前面没有decltype-specifier,那么查找前面的名称::仅考虑其特化类型为<的名称空间,类型和模板< / strong>即可。如果找到的名称未指定名称空间或类,枚举或依赖类型,则程序格式错误。[示例:

class A {
public:
    static int n;
};

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

-end example]

答案 1 :(得分:1)

是的,这样做完全没问题。 命名空间的设计是为了在代码/项目的大小变大后解决这类问题。

Here是查看C ++内容的好地方。