std命名空间

bladelyer 2013-01-06 04:07:05
C++标准的的所有成员都被置于std命名空间内,那么从C继承的成员也应该被置于std命名空间;但是测试发现使用继承的C成员不用加std命名空间限定,即使加了也结果也是一样的。很纠结,一直找不到能直接引用C成员的理由说明,求解
...全文
297 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bladelyer 2013-01-07
  • 打赏
  • 举报
回复
引用 14 楼 zhangtonghui816 的回复:
引用 13 楼 bladelyer 的回复:引用 12 楼 zhangtonghui816 的回复:楼主,可能你忘了,C的是全局命名空间的,C++中的C也是全局命名空间的,而C++采用的是标准命名空间,如<iostream>,以前的版本有iostream.h的这个是全局命名空间的,不加std的也。 说白了,为了兼容C吧,为了兼容C,C++的库文件都写得可读性比较……
引用全局命名空间的“strcpy、::strcpy”和和std命名空间的“std::strcpy”应该是编译阶段对头文件strcpy成员的声明查找,并比关系到链接阶段的库问题。从编译结果看,编译阶段搜索全局命名空间和std命名空间的strcpy声明都是可见的,这也不符合cstring所有的成员都被置于std命名空间的说法,但“strcpy、::strcpy”的引用编译却又是通过的。。。
zhangtonghui816 2013-01-06
  • 打赏
  • 举报
回复
引用 13 楼 bladelyer 的回复:
引用 12 楼 zhangtonghui816 的回复:楼主,可能你忘了,C的是全局命名空间的,C++中的C也是全局命名空间的,而C++采用的是标准命名空间,如<iostream>,以前的版本有iostream.h的这个是全局命名空间的,不加std的也。 说白了,为了兼容C吧,为了兼容C,C++的库文件都写得可读性比较差。C++的所有成员包括继承自C的成员在C+……
其实库是冗余的,std中都包括了C的库,但是C的库还有一种以全局变量即C的方式存在的。
bladelyer 2013-01-06
  • 打赏
  • 举报
回复
引用 12 楼 zhangtonghui816 的回复:
楼主,可能你忘了,C的是全局命名空间的,C++中的C也是全局命名空间的,而C++采用的是标准命名空间,如<iostream>,以前的版本有iostream.h的这个是全局命名空间的,不加std的也。
说白了,为了兼容C吧,为了兼容C,C++的库文件都写得可读性比较差。
C++的所有成员包括继承自C的成员在C++标准里面都是至于std命名空间的,例如“std::printf(...)”是可以编译通过的这个应该已经说明。但我修改 mymtom 的那段代码:
/**
* @file demo.cpp
* @brief
*/

#include <cstddef>
#include <cstring>

char s1[10];
char s2[] = "strcpy";

int main(int argc, char *argv[])
{
strcpy(s1, s2);
::strcpy(s1, s2);
std::strcpy(s1, s2);

return 0;
}

这里只包含 #include <cstring> 风格的头文件件
编译:

从结果看,引用全局命名空间的“strcpy、::strcpy”和和std命名空间的“std::strcpy”都是可见的。
zhangtonghui816 2013-01-06
  • 打赏
  • 举报
回复
楼主,可能你忘了,C的是全局命名空间的,C++中的C也是全局命名空间的,而C++采用的是标准命名空间,如<iostream>,以前的版本有iostream.h的这个是全局命名空间的,不加std的也。 说白了,为了兼容C吧,为了兼容C,C++的库文件都写得可读性比较差。
mymtom 2013-01-06
  • 打赏
  • 举报
回复
#include <string.h> strcpy, ::strcpy 可以使用 但是strcpy函数不会进入 namespace std; 所以 std::strcpy不能使用 #include <cstring> strcpy, ::strcpy 可以使用. 同时strcpy函数还会进入 namespace std; 所以 std::strcpy可以使用 举例说明

/**
 * @file    demo.cpp
 * @brief   
 */

#include <cstddef>
#include <string.h>

char s1[10];
char s2[] = "strcpy";

int main(int argc, char *argv[])
{

    ::strcpy(s1, s2);
    std::strcpy(s1, s2);

    return 0;
}

#include <cstring>

void func(void)
{
    ::strcpy(s1, s2);
    std::strcpy(s1, s2);
}
编译输出

g++ -Wall -o demo demo.cpp
demo.cpp: In function 'int main(int, char**)':
demo.cpp:16: error: 'strcpy' is not a member of 'std'
bladelyer 2013-01-06
  • 打赏
  • 举报
回复
引用 4 楼 supermegaboy 的回复:
引用 楼主 bladelyer 的回复:C++标准的的所有成员都被置于std命名空间内,那么从C继承的成员也应该被置于std命名空间;但是测试发现使用继承的C成员不用加std命名空间限定,即使加了也结果也是一样的。很纠结,一直找不到能直接引用C成员的理由说明,求解 c++ 是为了利于C代码向C++编译……
这好像是个解释,但网上都找不到这样的说明
bladelyer 2013-01-06
  • 打赏
  • 举报
回复
引用 3 楼 bladelyer 的回复:
引用头文件#include <cstdio> 比如:std::printf(....) 和 printf(.....)两种使用编译都是可以通过的,投点不明白
这好像是个解释,但网上都找不到这样的说明
bladelyer 2013-01-06
  • 打赏
  • 举报
回复
这好像是个解释,但网上都没找到这样的说明
东莞某某某 2013-01-06
  • 打赏
  • 举报
回复
看下 cstdio 头文件
飞天御剑流 2013-01-06
  • 打赏
  • 举报
回复
引用 楼主 bladelyer 的回复:
C++标准的的所有成员都被置于std命名空间内,那么从C继承的成员也应该被置于std命名空间;但是测试发现使用继承的C成员不用加std命名空间限定,即使加了也结果也是一样的。很纠结,一直找不到能直接引用C成员的理由说明,求解 c++
是为了利于C代码向C++编译器的迁移。
bladelyer 2013-01-06
  • 打赏
  • 举报
回复
引用头文件#include <cstdio> 比如:std::printf(....) 和 printf(.....)两种使用编译都是可以通过的,投点不明白
flatfoosie 2013-01-06
  • 打赏
  • 举报
回复
从C继承的成员是指什么意思。。。 另外有用 use namespace std 吗?
  • 打赏
  • 举报
回复
想用std的话 应该包含这样的 cstdio 头文件而不是 stdio.h

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧