注册 登录
编程论坛 C++教室

关于c++标准库

humy 发布于 2012-08-23 11:22, 905 次点击
1.为什么没有include他就会错,如图
只有本站会员才能查看附件,请 登录
如果写#include<string>在前面就不会有错。。。
2  维基百科上说“C标准库
主条目:C标准库
来自C标准库的所有头文件,以另一个名称包含在C++标准中。将原名称移去“.h”并在开头处加上“c”作为新的名称。例如“time.h”改成“ctime”。C++标准库的头文件与C标准库的头文件的   唯一区别是   ,函数位于std::命名空间(虽然很少编译器真正如此)。”
我又看了版主的c++标准库学习笔记“,比如 errno (在 <cerrno> 里)就是一个宏。如果以为它是一个 int,从而使用 std::errno 这样的语句,那么就会出错,而且往往编译器报的错误看上去还非常古怪。另外有一些看上去像函数的宏也常常引发问题,不过这个概率要小一些,因为在 C 的实践中,它们也老出问题,从而累积了不少经验。”      看似   区别不只一个吧?如果只是说区别是函数定义在std里,函数内容差不多,那还多此一举干嘛?
3.“任何以单下划线开始的名字是保留给实现和标准库的。”   中“实现”是什么意思?函数吗?
4.书上说:使用标准库可以大大减少现代c++程序中对指针的需要
为什么?
14 回复
#2
lonmaor2012-08-23 11:31
祝福楼主,你一定学的比我好
#3
pangding2012-08-24 01:03
1.为什么没有include他就会错,如图
    名空间也得先定义后使用。
程序代码:
namespace test { int a = 5; }
using namespace test;   // OK

int main()
{
    a = 10;

    return 0;
}
如果把前两行换一下是不行的。标准库头文件里声明过,包完了就可以用。如果你没包,编译器就不认识。

2  维基百科上说“C标准库。。。 唯一区别是   ,函数位于std::命名空间(虽然很少编译器真正如此)。”
。。。看似   区别不只一个吧?如果只是说区别是函数定义在std里,函数内容差不多,那还多此一举干嘛?
    不知道维基上说“很少有编译器真正如此”是什么意思。现代的编译器都很重视名空间的概念。

    那个 errno 的问题,不是 C++ 里特有的,在 C 语言里也规定 errno 也是一个宏。只是一般在 C 语言里,误以为它是一个整数好像不会犯什么太大的错误。比如 errno = 0 或者 int a = errno 这样的语句都没什么问题。
    但在 C++ 里,由于可能会习惯性的在这样的东西前加上 std::。可是这回就行不通了,因为宏不在 std 里。所以我才特别指出了一下而已。
    至于函数式的宏,即使在 C 语言里你以为它是个函数也会错误。比如取它的地址之类的。当然相关的语句在 C++ 里也是不成立的。我当时特意指出的目的是为了提醒那些已经熟悉 C 的人,在学习 C++ 的时候这些地方要特别注意。

3.“任何以单下划线开始的名字是保留给实现和标准库的。”   中“实现”是什么意思?函数吗?
   编译器也是程序,也是人写的。标准库也是要人开发出来才能用的。这些特殊的标识符语法是为了方便开发编译器和开发标准库的人准备的,而且他们只能用这个,不能使用任何不以下划线开头的标识符(你去随便找一个系统自带的头文件看看就知道了)。而一般的程序员不应该用这类标识符(但不是不能用)。你不用这样的标识符,就不用担心你定义的名字和其它东西重名了。

4.书上说:使用标准库可以大大减少现代c++程序中对指针的需要
    很多语言是没有指针这个概念的,实践在告诉我们指针这种类型不是必须的。使用指针才更方便的场合,一般都是在操作底层结构的时候。C++ 试图提供足够的组件,以高效实现底层结构,方便程序员使用。比如 new delete 和 引用 等机制,就可以在一定程序避免使用指针。使用 list 等容器更省去了自己实现基本数据结构的需要。c++ 希望你把精力放在其它东西上面,而这些方面可能并不能发挥指针的长处。


[ 本帖最后由 pangding 于 2012-8-24 01:07 编辑 ]
#4
xuexi0052012-08-24 07:35
慢慢接触类库,对指针的依赖少一些好,易懂!
#5
mfs1111162012-08-24 18:01
命名空间,正在学,书中列举了用命名空间的优点和缺点,大意是规范,避免错误吧……新手,请指教。
#6
humy2012-08-25 16:54
回复 2楼 lonmaor
?为什么?版主应该很强的。。。
anyway  ,thanks .
#7
humy2012-08-25 17:07
回复 3楼 pangding
1.是想知道c和c++库的区别去查的,但维基百科的那句话原来也就没看太懂。。。
2“任何以单下划线开始的名字是保留给实现和标准库的。” 这话 版主解释的很清楚但, “实现”是什么意思还没看出来。。。?
谢谢
#8
pangding2012-08-27 00:55
“实现”是什么意思还没看出来。。。?
标准库只是一个接口规范,比如它规定了 cout 应该 做什么,但没有规定怎样做。写编译器的人得想办法把标准库要求他们做的事情用代码写出来。这种行为称作实现一个标准库。
另外标准库还会使用一些比如 protect 内部数据。它们是标准库的一部分,但不希望用户可见。这些变量的名字标准库也规定为用下划线开头了。(这种情况在标准里不是很多见)

另一个术语是保留。它的本意是“有个东西挺有用的,我现在还没想好有什么用。但我先占个地留着,你们别使。等我想好了再告诉你们。”的意思。
这个术语并不是 C++ 中的概念。比如 intel cpu 的标识寄存器共有 32 位,但目前就只有 0-21 这 22 位在用(还没用全),22-31 这些位都没有指定意义。intel 手册就指明这些位是保留位,意思是说它们也许将来会用上。任何程序员都不要使用,以免将来你的程序无法正常工作。
所以提到保留,一般就是指,“这些东西另有用处,你们最好不要用”的意思。

因此“任何以单下划线开始的名字是保留给实现和标准库的。”其实就是说,下划线开头的标识符是保给那两种情况用的。如果你不是为这个目的,就不要用。

#9
humy2012-08-27 08:31
回复 8楼 pangding
恩。。谢谢。。“实现和标准库”在上面的例子我还是只看到了一种。。就是实现标准库。。。标准库规定了接口,写出实际代码就是实现的话,那“标准库”是什么?就是接口?那接口上的只有形参能用到下划线开头的名,那他们在实现代码里也会被用,那这两个不就是一个情况了?。。。。。还有,您解释   实现  说的是“比如”  那就还有其他情况?我看书也看多好多句子有实现这个词,大概意思就是给你一个概念框架,你把内容添上。。那我们自己也有很多这样的工作,那怎么还说我们不能用下划线。。。    总结“实现和标准库”难道就是标准库的实现?
#10
TonyDeng2012-08-27 08:33
问题很好,不过思路混乱,主要是概念不清的缘故。
#11
TonyDeng2012-08-27 09:11
“实现”,是指具体的细节。比如函数原型,是声明存在这么一个函数,但这个函数到底是如何工作的,具体的代码,却在另外的地方(这是一种信息隐藏的手段),那些具体的代码就是实现,你平时写程序的操作也是这样,写的就是实现。

你的主要问题,是没搞清楚标准库的概念。其实C/C++的工作机制,就是靠的函数,C/C++本身没有什么内置函数,不像别的语言,比如BASIC那样,有具体的函数,比如CHR()这样的函数,是语言自身内置的,属于保留字那样的东西,你不可能写出一个自己的函数也叫CHR(),但C/C++可以,你可以不#include <cstdio>,自己重新写一个printf()函数,实现与标准库中printf()完全不同的功能。这是什么意思呢?意思就是说,C/C++的标准库,其实是别人写好的了一套函数工具箱,供你使用的,你可以用,也可以不用,事实上标准库函数是已经编译好的代码,在你build自己的程序时,这些编译好的模块是链接到你的程序中的,等于别人替你写好了一部分函数。正因为标准库只是一套工具箱,所以很多时候,同样功能的函数,会以不同的形式在不同的地方以不同的面目出现。最典型如取绝对值的函数abs(),如果是有内置函数的语言,一般是只需一个ABS()函数就搞定所有数据类型的,但C/C++不是这样,它针对各种不同的数据类型有不同的函数,比如labs()、fabs()之类,这种名目繁多的函数名称,很容易让人迷乱。不过C/C++的优势也正在这里,由于你可以完全无视这些东西,当不存在,自己重新写一套也是可行的,反而显得非常灵活。其实,只要记住,标准库只是一套经过检验的、好用的函数集合,拿来用就是了,不必一切都自己来。Windows API,或者的别的什么API,如DirectX、OpenGL之类,也不过是更扩展出去的函数库而已,当标准库一样就是了。没有什么纯粹的C/C++编程,不使用标准库和成熟扩展库,C/C++都无法编程了,说这也不是C/C++、那也不是C/C++的人,其实很无知幼稚。
#12
pangding2012-08-27 13:03
以下是引用humy在2012-8-27 08:31:32的发言:

恩。。谢谢。。“实现和标准库”在上面的例子我还是只看到了一种。。就是实现标准库。。。标准库规定了接口,写出实际代码就是实现的话,那“标准库”是什么?就是接口?那接口上的只有形参能用到下划线开头的名,那他们在实现代码里也会被用,那这两个不就是一个情况了?。。。。。还有,您解释   实现  说的是“比如”  那就还有其他情况?我看书也看多好多句子有实现这个词,大概意思就是给你一个概念框架,你把内容添上。。那我们自己也有很多这样的工作,那怎么还说我们不能用下划线。。。    总结“实现和标准库”难道就是标准库的实现?
这个是我有点咬文嚼字了。
标准里规定了很多东西,也规定了一些变量或者类的名字,其中有些就是用下划线开头的。你要想实现标准库,那么标准规定了的部分,你必须严格用标准规定的名字。但还有一些标准没说,你自己实现的时候如果要用,那么你也得用下划线开头的名字,但用什么名字标准不管。前就是标准里的部分,后者是实现里的部分。其实不用抠的这么细,就统一都理解成实现也是完全可以的。

我文中的那个“比如”是“例如”的意思。先陈述一个概念,可能比较抽象,再举个具体的例子以帮助理解。
你自己编程主是是使用标准库,而不是实现它。
#13
humy2012-08-27 22:57
回复 12楼 pangding
谢谢
#14
gaoyao4692012-08-28 23:19
楼主 你现在学C++  都看些什么书,我也在学。
#15
fjk17192012-09-14 00:40
强悍的人办强悍的事情
1