6

所以,我发现自己在我的 C++ 程序中需要 libc。但是,我不喜欢将它洒在全局命名空间中的想法。理想情况下,我想强制整个 libc 进入std::命名空间,所以我必须这样做,std::memcpy而不是memcpy.

这可能吗?如何?如果需要,我愿意使用特定于编译器的宏(我只针对 MS VC++ 10.0 和 GCC 4.6)。

编辑:我的字面意思是“强制声明进入std”——这样它们在没有std::前缀的情况下是不可调用的。另外,我包括cstdio,不是stdio.h

谢谢!

4

4 回答 4

1

我的字面意思是“强制声明进入std”——这样它们在没有std::前缀的情况下是不可调用的。

如果您的实现公开了全局命名空间中的名称,则不能这样做。您可以使用 <cXXX> 标头,然后自己使用 std::。

这也许是不幸的,但这是 C 兼容性的结果,因为 C 不理解名称空间。C++ 传统上为 C 兼容性保留了许多杂项和牺牲。

于 2011-02-05T20:45:22.897 回答
1

你不能这样做,除非它已经完成了。

命名空间std为标准库保留,禁止向该命名空间添加新成员。因此,如果 C 标头尚未嵌入到 中std,那么您别无选择,只能接受它。

另一方面,您可以完美地创建一个新的命名空间,cstd并使用using指令将全局命名空间中的符号带入其中……但这不会使它们从全局命名空间中消失

于 2011-02-06T10:25:10.773 回答
0

使包装包括

//stdlib.hpp
namespace std
{
#include <stdlib.h> //edit: changed from cstdlib to stdlib.h
}

如果链接器讨厌这个尝试只声明你想要的功能:

namespace std{ extern "C" {

int memcpy( void *out, const void *in);
} }
于 2011-02-05T20:23:36.863 回答
0

一些(大多数?)C++ 编译器在全局命名空间中有 C 函数的原因很简单,因为它们必须使用现有的操作系​​统函数。例如,文件函数可能不是单独的 C 库,而是操作系统的文件处理。

于 2011-02-06T11:07:09.453 回答