[英]Where are Library definitions located?
有人可以说我在哪里可以找到源文件,标准库的定义在哪里?
例如,包含string.h
原型函数的定义的文件string.c
在哪里? 最重要的是,它存在吗?
它全部处于编译状态,有些可能已通过asm优化。 您需要找到编译器的源才能查看定义
对于GCC,这是开源的,你可以从他们的镜像站点下载的的libstdc ++库源在这里 。 下载中包括了std库的源代码。 请记住,不同的供应商将有不同的实现,因此提供的链接仅仅是GCC的开发人员决定实现标准库的方式
您可能不会喜欢这样。
C ++标准并未具体说明标准库中实际执行的位置。 它说明了声明的位置 ,但仅以它为文件命名的程度,您必须#include
才能引入名称。例如,标准说:
std::string
是basic_string<...>
的typedef
,并且为了将该typedef
引入程序,您必须#include <string>
。 它实际上并没有说basic_string
或string
是在<string>
中定义的,并且也没有说<string>
在硬盘上的位置。 实际上,在现实世界中通常不在<string>
中。 在我的实现中,(MSVC10) string
是在另一个文件<xstring>
,它看起来像这样:
typedef basic_string<char, char_traits<char>, allocator<char> >
string;
有用吧?
还有另一方面。 标准库中的许多内容都是模板内容,例如string
,因此,由于模板在C ++中的工作方式,这些功能必须称为“包含库”。 但并不是标准库中的所有内容都由模板组成。
考虑sprintf
。 标准说,该声明是由#include <cstdio>
提供的,但是,即使string
在声明的地方也一样。 sprintf
不是模板。 该实现在通常称为CRT的C运行库中。 这是DLL和LIB的集合(无论如何在MSVC10中),您的程序链接到这些DLL和LIB来运行sprintf
代码。
现在的坏消息是,CRT中的那些组件通常出厂时都没有源代码。 您不知道sprintf
的实现位置,也看不到源代码。 在这些情况下,除了找到MicroSoft的工作之外,您别无选择,因此您可以看一下源代码。 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.