C++;:如何强制libc声明进入std:? 所以,我发现自己在我的C++程序中需要LIBC。但是,我不喜欢在全局名称空间中散布它。理想情况下,我希望将整个libc强制放入std::名称空间,因此我必须执行std::memcpy而不是memcpy

C++;:如何强制libc声明进入std:? 所以,我发现自己在我的C++程序中需要LIBC。但是,我不喜欢在全局名称空间中散布它。理想情况下,我希望将整个libc强制放入std::名称空间,因此我必须执行std::memcpy而不是memcpy,c++,namespaces,libc,libstdc++,C++,Namespaces,Libc,Libstdc++,这可能吗?怎么做?如果需要,我愿意使用特定于编译器的宏(我只针对MS VC++10.0和GCC 4.6) 编辑:我的字面意思是“强制声明为std”-因此它们在没有std::前缀的情况下是不可调用的。另外,我包括cstdio,而不是stdio.h 谢谢 制作包装包括 //stdlib.hpp namespace std { #include <stdlib.h> //edit: changed from cstdlib to stdlib.h } 我的字面意思是“强制声明为std”-

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

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

谢谢

制作包装包括

//stdlib.hpp
namespace std
{
#include <stdlib.h> //edit: changed from cstdlib to stdlib.h
}
我的字面意思是“强制声明为std”-因此它们在没有std::前缀的情况下是不可调用的

如果实现在全局命名空间中公开名称,则无法执行此操作。您可以使用标题,然后使用std::yourself


这也许是不幸的,但这是C兼容的结果,因为C不理解名称空间。传统上,C++对C兼容性有很多限制和牺牲。

除非你已经完成了,否则你不能这样做。 命名空间

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


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

< P>为什么一些(大多数)C++编译器在全局命名空间中具有C函数,只是它们必须使用现有的操作系统函数。例如,文件函数可能不是一个单独的C库,而是操作系统的文件处理。

它们已经在
std
名称空间中。另外,MS VC++头文件使用std::
为每个libc函数添加
,因此这没有帮助。不确定GCC是否也这样做。使用不会做垃圾,因为它被包装在另一个std命名空间中。发生的是使用std::foo}的名称空间std{namespace std{…}。链接器可能不喜欢它,除非它能够在crt库中找到符号
std::memcpy
。如果它强制自己查找所采取的点,则可能会出现问题。这在MS VC++上运行得非常好,但是在GCC 4.1.2上却不行:这很可能会中断,或者只是做了错误的事情。好的。尝试使用
#include
而不是
cstdio
。lib.h文件中没有名称空间内容。它在gcc 4.2.1中起作用,“我的字面意思是‘强制声明到std中’——因此它们在没有std::前缀的情况下是不可调用的。”在您之后的程序员可能不喜欢这一点。这是一个具有既定编码约定的开源项目。我可以写一篇关于为什么贡献者不应该改变代码风格的论文,但这不是一个地方……理论上,当你包含
标题时,所有非宏实体都应该只包含在
std
中,而不包含在全局名称空间中。实际上,大多数实现都没有这样做,而下一个C++标准C++ 0x改变了规则,允许 < /Cord>头将名字放入全局命名空间。在我看来,它们正在使情况变得更糟…但不管怎样,事情就是这样。我同意这更糟,但强加没有人遵守的规则是没有用的:-|
namespace std{ extern "C" {

int memcpy( void *out, const void *in);
} }