今天使用 man string 來查看 string 文件的使用的方法(畢竟裡面的函數名字和傳入參數和發揮參數的類型,如果一段時間不使用,會產生遺忘。) 偶然發現,string.h 的man page 中 出現了 strings.h 的說明。這引起的我的好奇,很奇怪這個strings 和 strin ...
今天使用 man string 來查看 string 文件的使用的方法(畢竟裡面的函數名字和傳入參數和發揮參數的類型,如果一段時間不使用,會產生遺忘。)
偶然發現,string.h 的man page 中 出現了 strings.h 的說明。這引起的我的好奇,很奇怪這個strings 和 string 之間的關係。我上網搜了幾個帖子,他們寫的不夠清楚,今天我進行重新整理一下吧:
首先我們看一下man string 裡面的內容:
可見,strings 頭文件中包含了部分函數,沒有在 string.h 中出現的。上圖的環境是 macOS Sierra 版本號為:10.12.6
包括; index, rindex, strcasecmp, strncasecmp 這四個函數。
為了一探這個頭文件是不是只有macos 這種 Unix-like 系統中才出現。我在Linux下的ubuntu 系統中也進行了查看。
我們使用命令: man string 命令,同樣可見相同的內容。可見它已經是c 標準庫中的頭文件。
進階:我們到底該用哪個頭文件呢?
為了進一步搞清楚,我們到底在編程的使用string 還是 strings 頭文件。我們在 linux 的 /usr/include 文件夾中打開strings 頭文件來一窺究竟。
在 strings.h 文件中給了我們明確的答案:
大意為: 如果我們使用了string.h 這個頭文件,那麼我們不需要在進行包含這個 strings.h 這個文件。除非有一種情況。如果 沒有定義 __USE_MISC這個變數,這個變數將會在 strings.h 頭文件中進行定義。因為 string.h 中沒有進行對這個變數進行定義。具體怎麼定義的,大家可以在/usr/include/strings.h 這個文件中進行詳細查看。
更進一步:
為了進一步查看社區中的這兩個文件的看法,我們在 stackoverflow 中 找到了這個話題的討論。和我們的解釋大同小異:
觀點1:
strings.h comes from the BSD branch in the unix evolution. Its content has been standardized by POSIX, but most of it is marked as legacy and can be easily replaced with other functions
觀點2:
Typically <strings.h>
just adds some useful but non-standard additional string functions to the standard header <string.h>
. For maximum portability you should only use <string.h>
but if you need the functions in <strings.h>
more than you need portability then you can use <strings.h>
instead of <string.h>
.