例如,我希望看到函数toupper()
的代码,以了解它是如何工作的,有什么办法吗?我搜索并打开了string.h
库,但没有找到任何内容。
答案 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 :(得分: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;
}