簡體   English   中英

如何在C ++中查看標准庫函數?

[英]How to view standard library functions in C++?

例如,我想查看功能toupper()的代碼以了解其工作原理,有什么辦法嗎? 我已經搜索並打開了string.h庫,但是沒有找到任何東西。

從嚴格的語言角度來看,您不能“看到標准函數的代碼”,因為C ++語言標准僅定義函數的原型和行為,而不是函數的實現方式。

實際上,從嚴格的語言角度來看,像toupper這樣的標准函數甚至不必具有源代碼,因為像<string.h>這樣的標准標頭甚至都不必是文件!

當然,在實踐中 ,您可能永遠不會遇到標准標頭不是文件的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. 編程接口,而不是實現。

是的,當然可以(不是所有實現都可以)。 例如,glibc實現 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM