为什么使用<cheader>而不是<header.h>?
Why use <cheader> instead of <header.h>?
我一直认为,如果你做#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
在全局命名空间中,因为我有一个家庭分配:编写我自己的内存分配器(特别是malloc
和free
函数),我将把它们编译成动态库并插入使用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包装器,如智能指针或标准容器,以避免处理低级内存管理、new
和delete
。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中