在C函数中使用`std`命名空间是否可行?

5

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


尽管我试图在接口中使用std::size_t,但我必须承认,在我经常使用size_t的源文件中,我倾向于使用using std::size_t; - CB Bailey
3
为什么将问题标题的意思改变了? - CB Bailey
@CharlesBailey,这个问题很有趣,所以我把标题改成了更通用的文本。另一种方式也可以。在谷歌搜索时会很有帮助 :)。对于Paul,只是出于好奇,我问了一下。 - iammilind
1个回答

16

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

不,你不应该这样做。

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

[C++11:D.5/2]:每个C头文件,其名称形式为name.h,尽管与其对应的头将所放置在标准库命名空间中的每个名称都视为放置在全局命名空间范围内。 未指定这些名称是否首先在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]: 除Clauses 18至30和Annex D所述之外,每个头文件的内容应与相应的头文件name.h相同,如同已包含C标准库(1.2)或C Unicode TR中规定的那样。然而,在C++标准库中,声明(除了在C中定义为宏的名称)位于std 命名空间(3.3.6)中。然而,这些名称是否首先在全局命名空间作用域内进行了声明并随后通过显式using-declaration (7.3.3) 注入到命名空间std中是未指定的。


为什么标准没有明确规定?可能的原因是什么? - Destructor
@Destructor:我真的不知道。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接