【问题标题】:C stdlib .h's on C++ and malloc/reallocC stdlib .h 在 C++ 和 malloc/realloc 上
【发布时间】:2010-12-21 04:39:43
【问题描述】:

全局命名空间中包含 C stdlib 函数真的让我很困扰,最后写了 ::snprintf 或 ::errno 或 struct ::stat 之类的东西等,以区别于我自己在使用这些 c stdlib 函数的封闭命名空间中的一些函数。

然后我发现有一种方法可以在 std 命名空间中声明每个 C stdlib 函数(作为 STL):只需包含 而不是 所以我编辑了我的代码使用那些新的“c for c++”包括。

Debian/GCC 4.3.4 上我必须解决 2 个问题:

1) #error 此文件需要编译器和库支持,以支持即将推出的\ ISO C++ 标准,C++0x。这种支持目前是实验性的,必须是\ 使用 -std=c++0x 或 -std=gnu++0x 编译器选项启用。

2) 使用 -std=c++0x 我的程序编译得很好,但我没有修改 ::snprintf 或 ::time 等。每个 C stdlib 函数仍在全局命名空间 =(!(不,我没有使用命名空间 std 一次也没有)

有什么想法吗?

例如..如何阻止 c stdlib 入侵我的全局命名空间? 是下一个 C++ 标准的实验性功能还是可以立即安全使用?

然后我有另一个疑问,也许值得提出一个新问题.. 没有 cmalloc。我知道关于新替换 malloc 的全部历史以及原因。但是对于简单的纯字节缓冲区,没有 realloc 的 c++ 等价物。我知道内存块和重新分配是特定于实现的,但是当有连续的​​空闲内存块时,重新分配比新的缓冲区分配和内存复制效果更好。

谢谢 =)!

【问题讨论】:

  • 为什么还有其他snprintf函数之类的?
  • 那么,你为什么在 C++ 程序中使用snprintf
  • @jalf:因为它比 C++ 流更干净、更易读、更快?
  • tomekszpakowicz 是正确的。我认为我不需要 C++ 流来处理和操作字节缓冲区。我只是使用 snprintf 来进行字符串/整数转换.. 我理解它在流实现的内部无论如何都会使用。

标签: c++ c linux gcc include


【解决方案1】:

对于您的第一个问题,这取决于您要包含哪些标题。大多数 C 头文件在现有 C++ 版本中以 c(lib) 形式提供。一些不是,可能会在 C++0x 中添加。因此,如果您尝试包含其中任何一个,您可能会收到该错误。

其次,此表单的所有标题保证函数将在std 命名空间中可用。但他们不承诺不理会全局命名空间。通常,他们将符号放在两个命名空间中。

我不知道为什么 ::snprintfstd::snprintf 更困扰你。在这两种情况下都必须指定前缀。

至于realloc,不存在 C++ 等价物,可能是因为它的麻烦多于其价值,尤其是在 C++ 复制对象的更复杂语义的情况下。 (特别是,如果您尝试使用它,请不要在缓冲区中存储任何非 POD 对象,因为 realloc 只会在必要时将 memcpy 它们放到新分配的缓冲区中,这会破坏非 POD 对象。 )

当然,您仍然可以通过包含其标头来使用 C 中的旧 realloc。但我会说你最好使用 new/delete,并简单地找出一个合理的缓冲区分配策略。

【讨论】:

  • 我相信所有 C90 标头实际上都可以在 C++03 中以 c... 的形式使用。 C++0x 中唯一的新东西是一些 C99 头文件。
  • “如果您尝试使用它,请不要在缓冲区中存储任何非 POD 对象” - 我不认为“这与放置 new 不兼容”必然意味着“这比它的价值更麻烦”。但每次你认为你需要realloc 时,你可能应该停下来弄清楚究竟是什么vectordeque 不能满足你的要求。
【解决方案2】:

标准 C 中的 malloc() 函数未在“<malloc.h>”标头中声明。它在<stdlib.h> 中声明。 realloc()free() 相同。

我不知道 C++,但不是

#include <cmalloc>

试试

#include <cstdlib>

【讨论】:

    【解决方案3】:

    c 大致将 .h 包含在 namespace std { } 中,是 C++ 的标准功能。如果您有权访问任一标准,请参阅 §17.4.1.2。

    这根本不是一个实验性功能——什么头文件给你带来了兼容性问题?

    使用 malloc 等。很好,但一定不要将它们与新/删除混合。 (例如,不要 delete malloc()'ed 缓冲区。)

    【讨论】:

      【解决方案4】:

      有一些标准的 C 头文件尚未传输到 。可能你在某处使用过 之类的东西。

      使用当前标准,您可以列出 here 的 c 库。请注意,不是它的一部分。

      我没有找到描述 是否以及何时成为 c++ 一部分的参考资料,但如果我尝试包含它,我还会收到一条错误消息,告诉我应该使用 -std=c++0x,所以我认为它计划包含在下一个 c++ 标准中。

      【讨论】:

      • 参考?他们都应该在那里。
      • Stackoverflow 杀死了用尖括号括起来的单词。抱歉,已修复。
      • 好吧,所以只需使用 代替。或者 C++0x 开关。
      猜你喜欢
      • 2012-09-19
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2018-10-22
      相关资源
      最近更新 更多