C stdlib .h 在 C++ 和 malloc/realloc 上

con*_*roy 2 c c++ linux gcc include

我真的对在全局命名空间中包含C stdlib函数感到困扰,并最终编写了诸如 ::snprintf 或 ::errno 或 struct ::stat 等内容,以区别于封闭命名空间中我自己的一些函数,其中那些使用了 c stdlib 函数。

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

Debian/GCC 4.3.4 上,我有两个问题:

1) #error 这个文件需要编译器和库支持即将到来的\ ISO C++ 标准,C++0x。此支持目前处于实验阶段,必须使用 -std=c++0x 或 -std=gnu++0x 编译器选项启用。

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

有什么想法吗?

例如..如何阻止 c stdlib 入侵我的全局命名空间?< c(lib) > 是下一个 C++ 标准的实验特性还是现在可以安全使用?

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

谢谢=)!

jal*_*alf 5

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

其次,这种形式的所有头文件都保证函数在std命名空间中可用。但他们不承诺将全局命名空间单独存在。通常,他们将符号放在两个命名空间中。

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

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

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

  • “如果您尝试使用它,请不要在缓冲区中存储任何非 POD 对象”-我认为“这与放置 new 不能很好地配合使用”不一定意味着“这比值得的麻烦” . 但是每次你认为你需要 `realloc` 时,你可能应该停下来弄清楚每个 `vector` 和 `deque` 中的每一个都不能满足你的要求。 (3认同)