c++ - 有哪些命名空间以及规则是什么?

2025-11-09 02:32:09 2014德国世界杯

在 C(6.2.3 标识符的名称空间)中,名称空间的概念定义如下。

1 如果一个特定标识符的多个声明在翻译单元中的任何位置可见,则句法上下文消除了引用不同实体的用法的歧义。因此,各种类别的标识符都有单独的名称空间,如下所示:

— 标签名称(通过标签声明和使用的语法消除歧义);

— 结构体、联合体和枚举的标签(通过 any32 消除歧义)关键字 struct、union 或 enum);

——结构或工会的成员;每个结构或联合对其成员都有一个单独的名称空间(通过用于通过 . 或 -> 运算符访问成员的表达式的类型来消除歧义);

— 所有其他标识符,称为普通标识符(在普通声明符中声明或作为枚举常量声明)。

因此,例如,结构标记名称可以与函数名称一致,因为它们属于不同的名称空间。当你用结构标签名指定结构时你必须使用关键字struct。因此,例如,这些声明不冲突。

struct s

{

int s;

};

void s( void );

struct s s1;

在此代码片段s中,结构的标签名称与函数名称不冲突,s 因为标签名称应使用关键字指定struct。

在 C++ 中,您可以使用不带关键字的结构标记名称struct。

例如

struct s

{

int s;

};

s s;

是正确的代码。在这份声明中

s s;

声明标识符s的名称隐藏了结构名称。所以如果那么你会写例如

s s1;

那么编译器将发出错误,因为在此语句中 s 被视为上面声明的标识符的名称。要解决歧义,您需要使用关键字 struct

struct s

{

int s;

};

s s;

struct s s1;

这在 C++ 20 标准(6.3.1 声明性区域和范围)的以下引用中进行了描述

4 给定单个声明区域中的一组声明,每个声明都指定相同的非限定名称,

(4.1)——它们都应该指代同一个实体,或者都指代函数和函数模板;或者

(4.2) — 恰好一个声明应声明一个非 typedef 名称的类名或枚举名,而其他声明应全部引用相同的变量、非静态数据成员或枚举数,或全部引用函数和函数模板; 在这种情况下,类名或枚举名是隐藏的(6.3.10)。[注意:命名空间名称或类模板名称在其声明区域中必须是唯一的(10.3.2,第 17 条)。——尾注]

从引用中可以看出,命名空间名称在其声明区域中必须是唯一的。所以这些声明

struct Foo { };

namespace Foo { }

不正确。

最新发表
友情链接