可以放在名称空间中的完整法律实体是什么? 我现在正在学习C++。可以放在名称空间中的完整法律实体是什么

可以放在名称空间中的完整法律实体是什么? 我现在正在学习C++。可以放在名称空间中的完整法律实体是什么,c++,C++,此处的合法实体指命名空间的有效成员 哦,这是一个真正的问题。我来自.net,我有.net的心态 任何东西都可以放在名称空间中(当然,这对C++是合法的) 实际上,所有内容都在某个名称空间中—如果未指定,则为全局名称空间 所有东西都可以放在名称空间中,只有少数“实体”除外,它们将不编译 (1) 全局重载的运算符新建和运算符删除 namespace N { void* operator new (size_t size) // error { ... } } (2) 在名称空间的外部范围中

此处的合法实体指命名空间的有效成员


哦,这是一个真正的问题。我来自.net,我有.net的心态

任何东西都可以放在名称空间中(当然,这对
C++
是合法的)


实际上,所有内容都在某个名称空间中—如果未指定,则为全局名称空间

所有东西都可以放在
名称空间中
,只有少数“实体”除外,它们将不编译

(1) 全局重载的
运算符新建
运算符删除

namespace N
{
  void* operator new (size_t size) // error
  { ... }
}
(2) 在
名称空间的外部范围中声明的构造的定义;例如,如果全局声明了一个
类a
,则无法在
命名空间N
中定义其方法。同样,如果在
命名空间N
中声明了方法,则不能将其定义放入
命名空间N::Nested
(即
Nested
N
中的命名空间)

演示:


根据我的经验,我至少记得这两个限制。不知道规范。

任何代码都可以放在名称空间中

namespace userns
{
  int main() 
  {
     return 0; 
  }
}
但是
main()
function必须位于全局命名空间中。它不能放在用户定义的命名空间中

namespace userns
{
  int main() 
  {
     return 0; 
  }
}
此程序无法编译链接:

这是因为
userns::main()
不会被视为程序的入口点;它变得与任何其他用户函数一样,而不是标准的
main()
。要成功编译它,必须在全局命名空间中添加
main()

namespace userns
{
  int main() 
  {
     return 0; 
  }
}

int main() 
{
     return 0; 
}

这将立即编译链接:

什么是“完整的法律实体”?如果你能举几个你认为允许的事情和你认为不允许的事情的例子,人们可能会理解你的意思。“我正在学习日语。什么是可以放在“wa”之前的完整的法律实体?”这是一种可怕的学习任何语言的方法——计算机或其他方式——或学习任何东西的方法,真的。@Karl Knechtel:玩过之后,请现在帮帮我……我没有玩的意思。我想帮助你,不要浪费你的时间去想一些无用的东西。宏在命名空间中吗?我认为它们不能放在名称空间中。。。这就是为什么你必须给它们加前缀…没有人能阻止你把宏放在命名空间中。它的作用是其他的。您不能在
名称空间中放置任何内容。几乎没有限制。我在回答中已经描述了。我不同意你回答中的限制。我不认为他们错了。我只是说,有很多像这样的东西是可以写的。但他们只是在逻辑上错了。这就像“将一个函数放在名称空间A中,并从名称空间B调用它,而不指定作用域或包含整个名称空间”——当然这是不允许的,但是。。“这是意义上的限制吗?”图帕问道?这么多这样的事情。所以,我不这么认为。
这个程序不会编译。它编译,它不链接。法律上允许将
main()
放入
namespace
中(如第二个示例所示)。只是入口点应该是一个全局的
main()
。更准确地说:所有与类相关的定义和声明都必须在同一名称空间中。@James,我已经讲过同样的内容。但是,定义也可以在外部
命名空间中。