如何在C ++中查看标准库函数?

时间:2015-07-25 12:18:23

标签: c++ function

例如,我希望看到函数toupper()的代码,以了解它是如何工作的,有什么办法吗?我搜索并打开了string.h库,但没有找到任何内容。

2 个答案:

答案 0 :(得分:3)

从严格的语言角度来看,你不能“看到标准函数的代码”,因为C ++语言标准只定义了函数的原型和行为,而不是它们的实现方式。

事实上,从严格的语言角度来看,像toupper这样的标准函数甚至不需要包含源代码,因为像<string.h>这样的标准标题甚至不必是文件!

当然,在 practice 中,您可能永远不会遇到标准头文件不是文件的C ++实现,因为文件只是标头的一种自然而简单的实现。这意味着在实践中,对于标题<string.h>,实际上在您的计算机上某处有一个名为“string.h”的C ++源文件。 找到并打开它。

  

我搜索并打开了string.h库,但没有找到任何内容。

然后你看得不够近。提示:此文件很可能包含一个或多个其他头文件。

请注意,如果您确实查找了toupper,那么该功能无论如何都不在<string.h>中。请改为<ctype.h>。 cppreference.com是一个很好的在线参考,可以告诉您哪些标题包含哪些函数。

http://en.cppreference.com/w/c/string/byte/toupper

同样,这并不意味着编译器的相应头文件直接包含该函数,但它可能直接或间接包含其他包含它的文件。

无论如何,要小心你将在编译器的头文件中看到什么。它通常会比您想象的要复杂得多,更重要的是,它通常会使用您不允许在自己的代码中使用的构造;毕竟,这些文件中的代码是编译器实现的内部代码,编译器具有许多您没有的权限,例如使用其他禁用标识符,如_STD_BEGIN。还期待很多完全非标准的#pragma和其他非便携式的东西。

要记住的另一个重要事项是,您不应该深入了解函数的实现以找出它的作用。在编写得很糟糕的软件中,即具有令人困惑的界面和没有文档的软件(存在于现实世界的任何地方),如果您有权访问源代码,那么您不得不这样做。

但是C ++标准函数是完美的文档,并且有一些可论证的例外,它们具有设计良好的接口。调试可能很有趣,教育,有时甚至是必要的,以便在您的系统上查看它们的实现,但是不要让这种可能性让您无法学习两种重要的软件工程技能:

  1. 阅读文档。
  2. 编程到接口,而不是实现。

答案 1 :(得分:1)

是的,当然,你可以(不是所有的实现,也许)。例如,glibc实现defines toupper的功能如下:

#define __ctype_toupper \
  ((int32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TOUPPER) + 128)

int
toupper (int c)
{
  return c >= -128 && c < 256 ? __ctype_toupper[c] : c;
}