5

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

4

1 回答 1

16

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

不,你不应该。

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

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

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

[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应与相应标题的内容相同name.h,如 C 标准库 (1.2) 或 C Unicode TR 中规定的,视情况而定,如同通过包容。但是,在 C++ 标准库中,声明(在 C 中定义为宏的名称除外)在 namespace 的命名空间范围 (3.3.6) 内std未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式使用声明(7.3.3)注入命名空间。std

于 2012-02-05T12:51:46.820 回答