V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sqbing
V2EX  ›  C

各类C库的作用是什么?

  •  
  •   sqbing · 2012-03-28 08:50:45 +08:00 · 2095 次点击
    这是一个创建于 4404 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请问,纯C写的程序,有使用到C库吗?如果有,*nix和Windows使用的C库有什么区别?
    “C++”这个词代表的是一种语法约束+STL,还是仅仅是语法约束?
    是不是可以把C++看成是C的扩展,用链接STL库的方式?实现C++,链接其他库可以吗?比如uclibc,glibc?

    最近在看一个GLib相关的东西,忽然对纯C和C++迷惑了。
    30 条回复    1970-01-01 08:00:00 +08:00
    skywinger
        1
    skywinger  
       2012-03-28 09:24:53 +08:00
    各种问的都很幼稚,可以google或是百度先了解下最基本的情况,stl是c++的标准模板库,是属于c++规范
    avatasia
        2
    avatasia  
       2012-03-28 09:26:42 +08:00
    c++是stl的基础,不是仅仅有STL的吧
    c++ 模版和接口继承什么的是两大分支吧,我研究的不是很深。
    sqbing
        3
    sqbing  
    OP
       2012-03-28 09:32:09 +08:00
    @skywinger 你说我幼稚,没关系,说明你很懂。请问可以用glib或者uclibc代替STL吗?他们的功能相同吗?
    66450146
        4
    66450146  
       2012-03-28 09:55:56 +08:00
    1. STL不是被链接的,而是直接以源码方式提供,因为模板不能被分离编译

    2. 无论是什么样的lib,最后都必须要用OS提供的API。printf不是原生的接口,cout更不是,它们都要使用OS提供的接口,而这些接口在不同的OS上各不相同

    3. C++的链接方式和C不同,所以才有了extern "C"这样的关键字。“C++可以链接其他库”这样的说法并不严谨,应该说“C++支持对C库的链接”

    4. C++这个词是否包含STL并不重要,就像你不会在用printf的时候就觉得你用了“不纯洁”的C一样,虽然你知道它到底做了什么,这才是最重要的

    5. 纯C写的程序不链接C库,在理论上是可行的。如果你想知道更深入的东西,我只能告诉你程序的入口并不是main(),自己搜索其他东西对你更有好处

    :)
    guoquan
        5
    guoquan  
       2012-03-28 10:06:19 +08:00
    @sqbing 功能相同的东西要互相代替也需要一些设计模式在中间调和,因为接口不同。

    回答原帖问题
    c库就是有一定功能的函数集合,该调用就调用,跟是不是纯c写东西没什么关系。
    *nix 和 Windows 使用的库可以不同,因为同一个功能可以有不同实现,作为os,在文件管理,进程调度,甚至是内核的范畴上都可以有不同理解,有不同侧重,更别说用相同的库了,没有这种要求的。
    c++可以理解成一种语法约束,当然还可以理解成要包括实现该约束的分析器和编译器。stl不是必要部分,但是是重要的补充。
    c++可以理解成c的扩展,但是不是由于stl,而是新语法及约束的引人,最重要的是引人了面向对象的思想。注意到,这和stl没什么关系。
    关于实现c++……我没有看错问题的话,这和什么库也没什么关系,你非得自己写都行……
    另外,stl可以看作是大家达铖一致的接口,是标准库的一部分,就是是个标配,比如你买电脑标配1G内存,你还可以装其他内存条,也可以把原来这条拔掉不用。但是作为标准库,不管那个平台的编译器,它想要达到标准,就都希望实现这些接口使得使用它的人可以更好更轻松的移植他们的程序,但是实在不实现他,那也不能说他不是c++。所以不同编译器可以有不同的stl实现,但是接口是一致的。
    uclibc,glibc都是纯c库,是两种具体实现了(不是stl的实现)。uclibc与glibc接口基本兼容,可以一定程度上互相替代。你连接前者就不用后者了。
    至于他们和stl的替代关系,由于接口不同,直接替代是不可能的。他们都包括些基本功能,但是不能说相同,接口更不通。但是可以用一定的调和的方式。
    gysutantoman
        6
    gysutantoman  
       2012-03-28 10:10:40 +08:00
    刚想说点什么,LS两层都说完了。
    yelusiku
        7
    yelusiku  
       2012-03-28 10:14:07 +08:00
    1、正常的纯C写的程序必然要用到C库
    2、C库的接口由C语言标准定义,具体的实现各家厂商是不同的
    3、*nix和Windows上的C库在二进制格式上就是不同的,其实各家*nix之间也存在差异
    4、C++这个词代表的是一种不同于C的语言
    5、C++和STL同样是由C++标准定义的,具体的实现则各家厂商不同
    6、可以选择使用其他家的STL实现,比如SGI的实现

    楼主要搞清楚实现和标准的区别。
    soulhacker
        8
    soulhacker  
       2012-03-28 10:14:44 +08:00
    (成步堂看到了戈多检察官……)

    我觉得楼主的问题是什么库和开发语言之间,什么情况可以链什么库的问题(老实说问的是有点让人不知从何说起)。原则上:
    - C 和 C++ 开发的程序都能比较容易使用 C 的库(当然需要特定的方法,比如 extern 关键字)。
    - 原则上 A 语言很可能可以使用 B 语言写的库,但是必须遵循一定的规则,具体情况千差万别。
    - STL 是 C++ 规范的一部分,但它并不是语言本身的特征,只是一个模版库,通过引用其源代码使用(不在 link 时),模版会在编译其间被展开成为标准的 C++ 代码,所以非 C++ 语言直接使用 STL 是不行的。
    sqbing
        9
    sqbing  
    OP
       2012-03-28 10:39:25 +08:00
    @66450146 感谢你花时间回复我的问题!
    看来是我的描述有问题,我本来想问的是C++标准库,却全描述成了STL。
    我把问题修改成下面的样子。
    1.纯C写的程序,有使用到C库吗?如果有,*nix和Windows使用的C库有什么区别?
    2.“C++”这个词代表的是一种语法约束+C++标准库,还是仅仅是语法约束,而C++标准库可以另外实现?
    3.是不是可以把C++看成是C的扩展,用链接C++标准库的方式?如果是链接,那么C++标准库的实现种类是不是很多,比如某些组织实现自己的平台相关或者无关库?
    4.Boost这个库在C++标准库的大家族里是什么样的角色?
    sqbing
        10
    sqbing  
    OP
       2012-03-28 10:45:26 +08:00
    @guoquan @gysutantoman @yelusiku @soulhacker 感谢各位热心回答我的问题!我刚才在编辑,一刷新居然出现这么多答案。谢谢!
    66450146
        11
    66450146  
       2012-03-28 11:17:24 +08:00
    @sqbing
    1. 理论上可以不用到,但你几乎不可能不让它链接任何库,尤其是在main()被调用之前。不同库的区别就是,举个例子,比如在*nix上往控制台输出和Windows下往命令提示符数据就完全不是一回事,Windows下甚至还要额外的代码来启动命令行界面。

    2. 实际上包括了语法约束和标准库约束(例如STL),不包括其实现方式。

    3. 可以这样认为,C++的标准确实涵盖了几乎所有C标准的内容。我不太理解你的“链接”这个词,因为它对于模板来说没有多大意义。C++标准库的实现方式各家都不相同,比如你可以直接打开gcc和Visual C++的STL源代码查看其中的区别。

    4. Boost和标准库没有什么必然的联系,不过标准委员会和Boost开发者的交集比较大,所以在一些地方会有重复,甚至是把Boost库作为标准的试验田
    sqbing
        12
    sqbing  
    OP
       2012-03-28 11:53:48 +08:00
    @66450146 我说链接是因为有这样一个事例。
    我曾经给一块开发板做业务,厂家的工具链默认仅支持C开发,但是后来我们发现,使用C++能够更快的实现。因此我们重新build了工具链,在Makefile里链接的时候加了一条-lstdc++,于是C++的特性就加进来了。所以我想,是不是链接一个libstdc++就可以实现C++的特性,并且更换成别的库是不是也可以呢?
    ssword
        13
    ssword  
       2012-03-28 12:33:16 +08:00
    楼上同学的回答都很受益,thx :)

    楼主的疑惑也曾有过很长一段时间,后来了解一些链接与装载相关的知识之后再回过头来就不难懂了。
    Ricepig
        14
    Ricepig  
       2012-03-28 13:06:41 +08:00
    @sqbing 你这种情况是编译器本身就支持C++,只是厂家的默认工具链做了限制。C++和C的特性差别并不仅仅是库。造成你这种错觉的原因是现在已经比较难找到纯粹的C编译器了,现代C和C++编译器基本都集成在一起了。
    Ricepig
        15
    Ricepig  
       2012-03-28 13:15:50 +08:00
    @sqbing
    1. 可以不用到C库。你可以认为C库是对于操作系统的一些API对于C语言的标准化封装。通过这种标准化封装来实现C语言的源代码级跨平台。
    2. C++可以作为一种语言标准,或者是以这种语言为核心的一套工具链,包括编译器,库等等。C++库一直都有不同的实现,非常多种。
    3. C++并不是C语言的扩展,仅仅是提供对C语言的兼容性,而且这种兼容性还要看C语言的版本。而C++相对C语言的不同并不只是库,还有语言本身的很多机制。这么说吧,C语言就不认识Template,Class这些关键字,这些都不只是库的问题吧?确实有各家的C++库的实现,比如说GCC中的实现就是跨平台的,Intel的就是平台相关的。
    4. Boost不是C++标准库,只是由于功能比较强用的人比较多地位逐渐重要而已。
    soulhacker
        16
    soulhacker  
       2012-03-28 13:24:05 +08:00
    @66450146 检察官的回复非常准确,赞!

    p.s. 其实 c++0x 标准受到了 Boost 社区很大的影响,这个也是褒贬不一的一件事儿。。。
    66450146
        17
    66450146  
       2012-03-28 14:27:19 +08:00
    @sqbing 正如17楼所说,C和C++编译器很多时候都是混在一起的,估计厂家也不会想要花力气把它们分开的

    @soulhacker 律师。。。其实标准委员会组织和boost的主要贡献者几乎都是同一帮人,他们特别热衷于折腾编译器(说好听点叫做挖掘编译器的潜力)这项奇怪的事业,从TR1就可以感觉到他们的核心思想是“现在的编译器简直弱爆了!”这样。。。
    sqbing
        18
    sqbing  
    OP
       2012-03-28 19:16:06 +08:00
    @Ricepig 感谢你系统的回答.'兼容性'三个字点醒了我.
    我还是有个问题,C库是对系统能力的封装,那么如何绕过他呢?以前曾经看到讨论这些内容的邮件,无奈本人知识储备有限,没能读懂邮件中的实现.
    同时,再次感谢各位的耐心回答,这样的阅读真是一种享受.
    Ricepig
        19
    Ricepig  
       2012-03-28 19:31:26 +08:00
    @sqbing 不是绕过,是封装。其实库的代码很多时候都是可得的,linux的某些源就直接能下载这些代码。VC的话,很多时候也能找到CRT的源码。
    对于如何绕过这些封装,其实你就直接调用操作系统提供的接口(函数)就好了。比如windows不用fprintf写文件,而直接用Win32 API中的WriteFile写。
    G_virus
        20
    G_virus  
       2012-03-28 22:36:14 +08:00
    @66450146 想请教一下检察官,程序入口不是 main 那是什么?我对于链接和加载的知识目前仅限于 CSAPP ,书中对于链接部分讲解的相对简略,加载则基本没有讲到。为了不浪费检察官的时间,提供一个思路或者关键词就好了。
    reus
        21
    reus  
       2012-03-28 23:50:03 +08:00
    推荐书 http://book.douban.com/subject/3652388/ 程序员的自我修养
    sqbing
        22
    sqbing  
    OP
       2012-03-29 00:01:08 +08:00 via iPod
    @reus 谢谢,这本书正是我想得到的
    humiaozuzu
        23
    humiaozuzu  
       2012-03-29 00:01:13 +08:00
    @guoquan 关于“最重要的是引人了面向对象的思想。” ,其实C中早就有了面向对象的思想,如glibc就是C利用面向对象的一个优美实现,只不过C++语法支持的更好而已
    ototsuyume
        24
    ototsuyume  
       2012-03-29 00:35:04 +08:00
    @G_virus 非也。main只是代码的里的入口而已,main外层还有一个函数负责处理全局变量的初始化、类的构建,环境的初始化等等,最后才调用main。mian退出的时候再做相反的事情。
    66450146
        25
    66450146  
       2012-03-29 08:37:15 +08:00
    @G_virus stacktrace一下,看看main之外还有什么,然后就google吧 :)
    shiweifu
        26
    shiweifu  
       2012-03-29 09:13:12 +08:00
    推荐LZ本书:
    《程序员的自我修养:链接装载和库》
    guoquan
        27
    guoquan  
       2012-03-29 10:19:27 +08:00
    @humiaozuzu 这个事情要看怎么说,我嚼嘚讨论语言特性的话,不该说c就有面向对象了……事实上通过某些模式,c语言几乎有任何语言的任何特性,比如c可以并行,可以解析执行,可以面向函数,可以面向原型……但是如果这么讨论的话,楼主的问题更没法解答,会让他更混淆的……
    所以我觉得说语言特性的话,就可以说c语言本身不知道不明了不想要面向对象,而c++在语法上引人了面向对象。
    bhuztez
        28
    bhuztez  
       2012-03-29 10:35:01 +08:00
    sqbing
        29
    sqbing  
    OP
       2012-03-29 15:29:34 +08:00
    @guoquan 完全没听过解析执行的c,能给个关键字吗?我去问google
    guoquan
        30
    guoquan  
       2012-03-29 20:27:46 +08:00
    @sqbing 这种就不用较劲了-。- 理论上完全没有问题的。

    如果说解析执行的c。
    关键字 【c interpreter】试试

    其实我原来的意思是c能够通过某些方法获得一些脚本语言的特性。
    关键字【c dynamic script】
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1976 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:16 · PVG 00:16 · LAX 09:16 · JFK 12:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.