3

我一直认为,如果你这样做#include <cheader>header像 stdio/stdlib/string 这样的标准 c++ 标头在哪里),它与 相同#include <header.h>,但包装在std命名空间中。那么该代码片段如何编译(g ++ 4.7.3)?

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

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

第二个问题是——我应该怎么做才能将其中一些函数从全局命名空间中取出(同时使用 c++ 头文件)?例如,我不想malloc在全局命名空间中,因为我有一个家庭作业:编写我自己的内存分配器(特别是函数) mallocfree我将编译成动态库并使用LD_PRELOAD.

4

1 回答 1

4

那么该代码片段如何编译(g ++ 4.7.3)?

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

std[...]未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式使用声明(7.3.3)注入命名空间。

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

如果标准 C 函数无论如何都将位于全局命名空间中,为什么还要包括 then (而不是 )?

首先,作为一个好的风格问题。包括<stdio.h>让您确定所有实体都在全局命名空间中定义,同时包括<cstdio>让您确定这些实体在您想要的位置(在std命名空间中),这些名称可能出现(但不确定)不想要的缺点也在全局命名空间中。

我应该怎么做才能从全局命名空间中获取其中一些函数(同时使用 c++ 头文件)?

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

因此,例如,如果您必须执行低级内存管理,请使用new运算符而不是malloc. 另外,请注意强调“必须”:大多数时候,您应该使用 RAII 包装器,例如智能指针或标准容器,以避免不得不处理低级内存管理new,等等delete

于 2013-05-27T11:18:55.850 回答