为什么使用<cheader>而不是<header.h>?

Why use <cheader> instead of <header.h>?

本文关键字:gt lt header cheader 为什么      更新时间:2023-10-16

我一直认为,如果你做#include <cheader>(其中header是一些标准的c++头,如stdio/stdlib/string),它是相同的#include <header.h>,但包装成std命名空间。该代码片段如何编译然后(g++ 4.7.3)?

#include <cstdlib>
int main()
{
    malloc(1);
    return 0;
}

如果标准C函数无论如何都会在全局命名空间中,为什么要包括<cstdio>(而不是<stdio.h>)呢?

和第二个问题是-我应该怎么做得到一些这些函数的全局命名空间(而使用c++头在同一时间)?例如,我不希望malloc在全局命名空间中,因为我有一个家庭分配:编写我自己的内存分配器(特别是mallocfree函数),我将把它们编译成动态库并插入使用LD_PRELOAD的任何程序中。

该代码片段如何编译然后(g++ 4.7.3)?

因为c++ 11标准17.6.1.2/4规定:

[…是的。未指定这些名称是否首先在全局命名空间范围内声明,然后注入通过using-declarations(7.3.3)显式创建命名空间std

因此,允许实现在全局命名空间中定义这些实体。

如果标准C函数无论如何都会在全局命名空间中,为什么要包括它(而不是)?

首先,作为一个好的风格问题。包括<stdio.h>给了你确定性,所有的实体都是在全局命名空间中定义的,而包括<cstdio>给了你这些实体在你想要的地方(在std命名空间中)的确定性,与可能(但不确定)不必要的缺点,这些名称也可能出现在全局命名空间中。

我应该做些什么来得到一些这些函数的全局命名空间(而使用c++头在同一时间)?

不幸的是,您不能将实体从它所在的名称空间中取出。但是你可以做的(除了诅咒你的实现)是完全避免使用标准C函数,而更喜欢使用c++标准库中的函数。这些保证存在于std命名空间中。

因此,例如,如果必须执行低级内存管理,请使用new操作符而不是malloc。另外,请注意强调"必须":大多数情况下,您应该使用RAII包装器,如智能指针或标准容器,以避免处理低级内存管理、newdelete