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

C++ C++;为什么不';当名称空间发生冲突时,t结构/类与变量和函数发生冲突?,c++,variables,struct,namespaces,collision,C++,Variables,Struct,Namespaces,Collision,如果名称空间、函数和变量在同一范围内具有相同的名称,为什么它们都会发生冲突,而结构/类在与第一个名称冲突时,不会与变量和函数冲突 我可以理解为什么结构/类和名称空间彼此冲突,但不与函数和变量冲突,但我发现奇怪的是,当名称空间发生冲突时,结构/类不会与变量和函数冲突,可能是因为它们的使用方式相同(:)这两种名称空间都可以解释它们需要彼此不同(而现在的结果似乎有点不合理) 例1: int A; struct A {}; //void A() {} //Collision with int A //n

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

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

例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
ed。所以你有
struct stat
stat
函数,两者都在
中声明。在C语言中,这没有问题,因为当您单独键入
stat
时,它表示函数,当您键入
struct stat
时,它表示类型;没有碰撞

<>但是当你在C++中包含了时,你会发生什么?它将试图在全局范围内声明结构和函数,并用相同的名称声明,而在C++中,当引用一个类型时,不需要关键字<代码>结构> <代码>。C++必须允许这种“冲突”,否则它就不可能将这样的头包含在C++程序中。此外,C++必须具有这样的规则:当在同一范围内声明的函数和结构类型具有相同的名称时,该名称仅表示函数,而在其前面使用“代码>结构> < /代码>对该类型进行命名。只有这样才能保持与C的兼容性

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


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

您的
struct
s需要在它们后面加分号:
struct A{}不错!所以我假设C中的typedef与变量和函数冲突,嗯?@fast reflections是的,它们会。gcc给出了一个类似“重新声明为不同种类的符号”的错误。啊哈,所以要从示例1中生成A,我需要执行
struct A@PeterSW是的!或者自己做一个类型定义,比如“typedef struct a a”,那么在C语言中,它只能做a;与C++一样