【问题标题】:Is it ok to qualify C functions with the `std` namespace? [duplicate]可以使用“std”命名空间来限定 C 函数吗? [复制]
【发布时间】:2012-02-27 07:03:05
【问题描述】:

当我使用从 C 继承的函数时,例如 <cmath><cstdlib> 中的函数,我应该将它们限定为标准命名空间 std::log 的一部分,还是应该保留在 C 范围内并使用它们作为全局函数? size_t呢?

【问题讨论】:

  • 虽然我尝试在接口中使用std::size_t,但我不得不承认,在我经常使用size_t的源文件中,我确实倾向于使用using std::size_t;
  • @iammilind:为什么问题标题的含义会发生变化?
  • @CharlesBailey,这个问题很有趣,所以我把标题改成了更通用的文字。其他方式也可以。从谷歌搜索时会有所帮助:)。出于好奇,我问保罗。

标签: c++ namespaces std qualified-name


【解决方案1】:

如果你使用例如<math.h>

不,你不应该。

不确定它们是否在任何特定实现的命名空间std 中可用:

[C++11: D.5/2]: 每个 C 标头,每个标头都有一个 name.h 形式的名称,其行为就好像每个由相应 cname 标头放置在标准库名称空间中的名称都放置在全局名称空间范围内。 未指定这些名称是否首先在命名空间std 的命名空间范围(3.3.6)内声明或定义,然后通过显式using-declarations注入全局命名空间范围( 7.3.3)。

但是,您不应该使用此标头:

[C++11: C.3.1/1]: 为了与标准 C 库兼容,C++ 标准库提供了 18 个 C 头文件 (D.5),但在 C++ 中不推荐使用它们


如果你使用例如<cmath>

是的,你应该这样做。

不确定它们是否在任何特定实现的全局命名空间中可用:

[C++11: 17.6.1.2/4]: 除第 18 至 30 条和附录 D 中另有说明外,每个标头 cname 的内容应与 C 标准库 (1.2) 中规定的相应标头 name.h 的内容相同或 C Unicode TR,视情况而定,就好像通过包含一样。但是,在 C++ 标准库中,声明(在 C 中定义为宏的名称除外)在命名空间 std 的命名空间范围 (3.3.6) 内。 未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式using-declarations (7.3.3) 注入命名空间std

【讨论】:

  • 为什么标准没有指定?这可能是什么原因?
  • @Destructor:我真的不知道
猜你喜欢
  • 1970-01-01
  • 2019-07-10
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
相关资源
最近更新 更多