图书馆定义在哪里?

时间:2011-12-01 15:27:04

标签: c++ c

有人能说我在哪里可以找到源文件,标准库的定义在哪里? 例如,文件string.c在哪里包含string.h中原型函数的定义?最重要的是,它存在吗?

3 个答案:

答案 0 :(得分:3)

它全部处于强制状态,有些可能是由asm优化的。您需要找到编译器的源代码才能看到定义

答案 1 :(得分:3)

对于开源的GCC,您可以从镜像站点here下载libstdc ++库的源代码。下载中包含std库的源代码。请记住,不同的供应商将有不同的实现,因此提供的链接仅仅是GCC的开发人员决定如何实现标准库

答案 2 :(得分:2)

你可能不会喜欢这个。

C ++标准没有具体说明标准库中的任何内容实际实现的位置。它说明了声明的内容,但只是在命名文件的程度上,您必须#include才能将名称带入。例如,标准说:

std::string

typedef的{​​{1}},为了将basic_string<...>带入您的计划,您必须typedef。实际上并没有说#include <string>basic_stringstring中定义,并且它没有说明您的硬盘<string>上的位置。事实上,它通常不在现实世界的<string>中。在我的实现中,(MSVC10)<string>在另一个文件string中定义,它看起来像这样:

<xstring>

有用,是吗?

还有另一个方面。标准库中的很多东西都是模板,比如typedef basic_string<char, char_traits<char>, allocator<char> > string; ,所以由于模板在C ++中的工作方式,这些工具必须是所谓的“包含库”。但并非标准库中的所有内容都由模板组成。

考虑string。标准说这个声明是由sprintf提供的,但是,#include <cstdio>就像声明它的地方一样。并且string不是模板。实现是通常所谓的CRT - C运行时库。这是一个DLL和LIB的集合(在MSVC10中,无论如何),您的程序链接到该集合以运行sprintf之类的代码。

现在坏消息是CRT中的那些组件通常没有源代码。您不知道sprintf的实现位置,也无法查看源代码。除了获得MicroSoft的工作之外,您在这些情况下几乎没有其他选择,因此您可以查看源代码。 :)