C ++为什么命名空间不会与变量和函数碰撞?

时间:2014-10-20 22:18:08

标签: c++ variables struct namespaces collision

如果命名空间,函数和变量在同一范围内具有相同的名称,它们如何碰撞,而结构/类在与第一个碰撞时不会与变量和函数发生碰撞?

我可以看到为什么结构/类和命名空间相互冲突而不是与函数和变量冲突但是我发现结构/类在命名空间不与变量和函数冲突时很奇怪,可能是因为它们是以相同的方式使用(::)并且两者都会产生各种名称空间,这可以解释它们需要彼此不同(而结果现在似乎有点不相干)。

示例1:

int A;
struct A {};
//void A() {} //Collision with int A
//namespace A {} //Collision with int A (and also struct A if int A is removed)

示例2:

struct A {};
void A() {} 
//int A; //Collision with function A
//namespace A {} //Collision with function A (and also struct A if int A is removed)

示例3:

namespace A {}   
//struct A {}; //Collision with namespace A
//void A() {} //Collision with namespace A
//int A; //Collision with namespace A (and function A if namespace A is removed)

1 个答案:

答案 0 :(得分:6)

我相信结构的原因,就像你说的那样,不会碰撞"变量和函数与C兼容。

在C中,结构类型必须使用struct关键字进行标记,除非它已被typedef编辑。所以你有struct statstat函数之类的东西,都在<sys/stat.h>中声明。在C中没有问题,因为当你单独键入stat时,它意味着函数,当你键入struct stat时,它意味着类型;没有碰撞。

但是当你在C ++中#include <sys/stat.h>时应该发生什么呢?它将尝试在全局范围内声明结构和函数,使用相同的名称,并且在C ++中,您不需要 关键字struct当提到一个类型。 C ++必须允许这种&#34;碰撞&#34;否则它根本不可能将这样的头包含在C ++程序中。此外,C ++必须具有以下规则:当在同一范围内声明的函数和结构类型具有相同的名称时,该名称单独表示该函数,而在其前面加上struct命名该类型。只有这样才能保持与C的兼容性。

对于类,它可能只是因为除了成员和基础的默认可见性之外,类应该与结构相同。它会不必要地使语言复杂化以引入更多差异。

没有充分的理由允许名称空间与同一作用域中的变量和函数具有相同的名称,因为C中没有名称空间。所以不允许这样做。