注意:这个问题是关于name space
,不是namespace
。
C ++标准引用了name space
,但是我没有看到它的定义。该标准说标签和宏位于不同的名称空间中。所有其他引用name space
都在C / C ++兼容性部分中,如下所示(当前草案):
这是C和C ++之间少数可归因于新的C ++名称空间定义的不兼容性之一,在新的C ++名称空间定义中,名称可以在单个作用域中声明为类型和非类型,从而导致非类型名称隐藏类型名称,并要求使用关键字class,struct,union或enum来引用类型名称。这个新的名称空间定义为C ++程序员提供了重要的符号方便,并有助于使用户定义类型的使用与基本类型的使用尽可能相似。
这个新的名称空间定义是什么?在标准中哪里可以找到它?确切的规则是什么?规则似乎比“非类型隐藏类型”更复杂。就像,这不会编译:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
但这确实是:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
而且这也不会编译:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
[stmt.label]/1
,一个用于宏[cpp]/8
。