C++ 当命名空间发生冲突时,为什么结构/类不与变量和函数发生冲突?

C++ Why don't structs / classes collide with variables and functions when namespaces do?

本文关键字:冲突 变量 函数 为什么 命名空间 结构 C++      更新时间:2023-10-16

如果名称空间、函数和变量在同一范围内具有相同的名称,为什么它们都会发生冲突,而结构/类在与第一个冲突时不会与变量和函数发生冲突?

我可以理解为什么如果结构/类和名称空间相互碰撞,而不是与函数和变量碰撞,但我发现奇怪的是,当名称空间碰撞时,结构/类不与变量和函数碰撞,也许是因为它们以相同的方式使用(:),并且都构成了各种名称空间,这可以解释它们需要彼此不同(而现在的结果似乎有点无关紧要)。

示例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)

我相信,正如你所说,结构不会与变量和函数"冲突"的原因是与C.的兼容性

在C中,结构类型必须使用struct关键字进行标记,除非它是typedef。因此,您有struct statstat函数之类的东西,它们都是在<sys/stat.h>中声明的。在C中,这没有问题,因为当您单独键入stat时,它意味着函数,而当您键入struct stat时,它表示类型;没有碰撞。

但是,当您在C++中#include <sys/stat.h>时,应该发生什么呢?它将尝试在全局范围内用相同的名称声明结构和函数,并且在C++中,当引用类型时,不需要关键字struct。C++必须允许这种"冲突",否则就不可能在C++程序中包含这样的头。此外,C++必须有一条规则,即当在同一作用域中声明的函数和结构类型具有相同的名称时,该名称单独表示函数,而在其前面加上struct则命名类型。只有这样才能保留与C的兼容性。

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

没有充分的理由允许名称空间与同一范围内的变量和函数具有相同的名称,因为C中没有名称空间,所以这是不允许的。