有人能说我在哪里可以找到源文件,标准库的定义在哪里?
例如,文件string.c
在哪里包含string.h
中原型函数的定义?最重要的是,它存在吗?
答案 0 :(得分:3)
它全部处于强制状态,有些可能是由asm优化的。您需要找到编译器的源代码才能看到定义
答案 1 :(得分:3)
对于开源的GCC,您可以从镜像站点here下载libstdc ++库的源代码。下载中包含std库的源代码。请记住,不同的供应商将有不同的实现,因此提供的链接仅仅是GCC的开发人员决定如何实现标准库
答案 2 :(得分:2)
你可能不会喜欢这个。
C ++标准没有具体说明标准库中的任何内容实际实现的位置。它说明了声明的内容,但只是在命名文件的程度上,您必须#include
才能将名称带入。例如,标准说:
std::string
是typedef
的{{1}},为了将basic_string<...>
带入您的计划,您必须typedef
。实际上并没有说#include <string>
或basic_string
在string
中定义,并且它没有说明您的硬盘<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的工作之外,您在这些情况下几乎没有其他选择,因此您可以查看源代码。 :)