2014-02-12 75 views
4

这样做是否正确? :是否有与名称空间名称相同的变量是正确的

namespace name { 
    int name; 
} 

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

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

它在GCC中有效。但是,标准版和其他编译器可以吗?

+4

对不起?当然。容易明白?我会说不。那些'name :: name = name'和'name = name :: name'这两行让我感到害怕。 – Proxy

+1

@Proxy:当它在一个名为'name()'的函数中返回一个'struct name'时更有意义。通过减少源代码中的独特拼写数量,避免拼写错误。 Python减少了类型错误的数量。 –

+0

@KerrekSB Python会减少类型错误的数量吗?根据我的经验,它只能将这些错误从编译时检测到运行时。 –

回答

4

是的,这是好的,我们需要看看范围解析运算符如何在这种情况下工作。如果我们看一下draft C++ standard部分3.4.3合格的名称查找实际上有一个非常类似的例子,它说(重点煤矿):

如果在一个嵌套的名称说明符A ::范围解析运算符不在前面加上decltype-specifier,查找名称前面的名称::仅考虑名称空间,类型和模板,其专业化类型为。如果发现没有指定命名空间或类,枚举,或依赖型的名称,程序是非法的构造。[实施例:

class A { 
public: 
    static int n; 
}; 

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

末端示例]

1

是的,这样做完全没问题。 命名空间的字面意思是设计来解决这种问题,一旦代码/项目的规模变大。

Here是一个很好的检查C++的好地方。

+5

不,[社区共识](http://meta.stackexchange.com/questions/194788/links-being-changed-to-cppreference-com)是cplusplus.com不是一个很好的参考,而[cppreference]( http://en.cppreference.com/w/)是。 –

+1

感谢您的提醒。 –

相关问题