当我想size_t
在C++中使用时,我应该包含<stddef.h>
还是<cstddef>
?我听过几个人说这<cstddef>
是个坏主意,应该弃用.这是为什么?
所以这是我一直想知道但却从未确定过的事情.所以这完全是好奇心问题,而不是真正的问题.
据我所知,当你#include <cstdlib>
在std::
命名空间中声明所有事情(当然除了宏)之外.我见过的每个实现都是通过执行以下操作来实现的:
#include <stdlib.h>
namespace std {
using ::abort;
// etc....
}
Run Code Online (Sandbox Code Playgroud)
这当然会影响全局命名空间和std
.这种行为有保证吗?或者实现是否可能将这些内容放入std
全局命名空间中而不是放在全局命名空间中?我能想到的唯一办法做到这一点是有你的libstdc ++实现每一个C函数本身将它们放置在std
直接而不只是包括现有的libc头文件(因为没有机制来移除命名空间的东西).这当然是很多努力,几乎没有任何好处.
我的问题的实质是,以下程序是否严格符合并保证有效?
#include <cstdio>
int main() {
::printf("hello world\n");
}
Run Code Online (Sandbox Code Playgroud)
编辑:我发现的最接近的是这个(17.4.1.2p4):
除了如条款18至27所指出的,每一个报头的CNAME的内容应是相同于相应的头name.h的,如在ISO指定/ IEC 9899:1990编程语言C(第7章),或ISO/IEC :1990编程语言-C修正案1:C完整性,(第7条),酌情包括在内.但是,在C++标准库中,声明和定义(在C中定义为宏的名称除外)都在命名空间std的命名空间范围(3.3.5)内.
说实话,我可以解释任何一种方式."每头CNAME的内容应当相同相应的头name.h的,符合ISO/IEC 9899:1990编程语言C"告诉我,他们可以在全局命名空间是必需的,但"在但是,C++标准库,声明和定义(在C中定义为宏的名称除外)都在命名空间std的命名空间范围(3.3.5)内.说他们在std(但没有指明他们所在的任何其他范围).