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。我知道内存块和重新分配是实现/如此特定的,但是当有连续的空闲内存块时,重新分配比新的缓冲区分配和内存复制效果更好。
谢谢=)!
对于您的第一个问题,这取决于您尝试包含哪些标题。大多数 C 头文件都c(lib)以现有 C++ 版本的形式提供。有些不是,可能会在 C++0x 中添加。因此,如果您尝试包含其中任何一个,您可能会遇到该错误。
其次,这种形式的所有头文件都保证函数在std命名空间中可用。但他们不承诺将全局命名空间单独存在。通常,他们将符号放在两个命名空间中。
我不知道为什么::snprintf比std::snprintf虽然更困扰你。在这两种情况下,您都必须指定前缀。
至于realloc,C++ 等价物不存在,可能是因为它比它的价值更麻烦,尤其是 C++ 用于复制对象的更复杂的语义。(特别是,如果您尝试使用它,请不要在缓冲区中存储任何非 POD 对象,因为必要时realloc将memcpy它们存储到新分配的缓冲区中,这会破坏非 POD 对象。)
当然,您仍然可以realloc通过包含其标头来使用C 中的旧版本。但我想说你最好使用 new/delete,并简单地找出一个合理的缓冲区分配策略。
| 归档时间: |
|
| 查看次数: |
1657 次 |
| 最近记录: |