C++ 当命名空间发生冲突时,为什么结构/类不与变量和函数发生冲突?
C++ Why don't structs / classes collide with variables and functions when namespaces do?
如果名称空间、函数和变量在同一范围内具有相同的名称,为什么它们都会发生冲突,而结构/类在与第一个冲突时不会与变量和函数发生冲突?
我可以理解为什么如果结构/类和名称空间相互碰撞,而不是与函数和变量碰撞,但我发现奇怪的是,当名称空间碰撞时,结构/类不与变量和函数碰撞,也许是因为它们以相同的方式使用(:),并且都构成了各种名称空间,这可以解释它们需要彼此不同(而现在的结果似乎有点无关紧要)。
示例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 stat
和stat
函数之类的东西,它们都是在<sys/stat.h>
中声明的。在C中,这没有问题,因为当您单独键入stat
时,它意味着函数,而当您键入struct stat
时,它表示类型;没有碰撞。
但是,当您在C++中#include <sys/stat.h>
时,应该发生什么呢?它将尝试在全局范围内用相同的名称声明结构和函数,并且在C++中,当引用类型时,不需要关键字struct
。C++必须允许这种"冲突",否则就不可能在C++程序中包含这样的头。此外,C++必须有一条规则,即当在同一作用域中声明的函数和结构类型具有相同的名称时,该名称单独表示函数,而在其前面加上struct
则命名类型。只有这样才能保留与C的兼容性。
对于类,这可能只是因为除了成员和基的默认可见性之外,类应该与结构相同。引入更多的差异会使语言变得不必要的复杂。
没有充分的理由允许名称空间与同一范围内的变量和函数具有相同的名称,因为C中没有名称空间,所以这是不允许的。
- 尝试通过共享指针使用变量时读取访问冲突
- 局部变量名称冲突
- 如何处理冲突的函数和变量名称?
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 模块名称是否驻留在单独的"name space"中,或者它们可能与例如变量名称发生冲突?
- 如何解决头文件中的变量冲突?
- c++11 lambda 真的支持闭包吗?函数变量中存在语义冲突
- 尝试使用成员函数访问动态分配的成员变量时读取访问冲突
- 相互冲突名称的成员变量和方法变量
- 相同定义变量的部分类型冲突
- 写入结构变量时发生strcpy访问冲突
- C++-引发异常:读取访问冲突.变量为nullptr
- int max(一个变量)和 int max(int ,int)之间没有冲突,这是 C++ 中的一个函数
- 当函数在fread()应用于局部结构变量后返回时发生访问冲突
- C++ 当命名空间发生冲突时,为什么结构/类不与变量和函数发生冲突?
- 声明变量时发生访问冲突
- 变量和 getter 的 Qt 命名约定,这样它们就不会发生冲突?
- OpenGL 4.3程序Ubuntu 14.04 x64中的时间变量冲突问题
- 传递变量时的访问冲突
- 可以净化找出栈变量上的访问冲突