【问题标题】:C++ Why don't structs / classes collide with variables and functions when namespaces do?C++ 为什么结构/类不会与命名空间发生冲突时与变量和函数发生冲突?
【发布时间】:2014-12-16 00:55:40
【问题描述】:

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

我可以理解为什么结构/类和命名空间会相互冲突,但不会与函数和变量发生冲突,但我觉得奇怪的是,当命名空间发生冲突时,结构/类不会与变量和函数发生冲突,可能是因为它们被用于以相同的方式 (::) 并且都做出了各种命名空间,这将解释它们需要彼此不同(而现在的结果似乎有点无关紧要)。

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

【问题讨论】:

  • 您的structs 后面需要分号:struct A {};

标签: c++ variables struct namespaces collision


【解决方案1】:

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

在 C 中,必须使用 struct 关键字标记结构类型,除非它是 typedefed。所以你有struct statstat 函数之类的东西,它们都在<sys/stat.h> 中声明。在C语言中这个没有问题,因为单独输入stat是函数,输入struct stat是类型;没有碰撞。

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

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

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

【讨论】:

  • 不错!所以我假设 C 中的 typedefs 与变量和函数发生冲突,嗯?
  • @fast-reflexes 是的,确实如此。 gcc 给出一个错误,如“重新声明为不同类型的符号”。
  • 啊哈,所以要从示例 1 中获得 A,我需要执行 struct A a;
  • @PeterSW 是的!或者做一个你自己的类型定义,比如“typedef struct A A”,那么它就可以在C中只做A a;在 C++ 中
猜你喜欢
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2019-09-20
  • 2021-08-28
  • 2016-06-20
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多