1. 程式人生 > >解決隱式宣告與內建函式不相容問題終極“利器”

解決隱式宣告與內建函式不相容問題終極“利器”

有時候,我們編譯程式碼時出現:

gcc wserver.c -o wserver
wserver.c: 在函式‘main’中:
wserver.c:27:2: 警告:隱式宣告與內建函式‘memset’不相容 [預設啟用]
  memset( &servaddr, '\0', sizeof(servaddr));

這種情況多半是缺少某些標頭檔案。那麼如何確定缺少那些檔案呢?

Linux下查詢該函式位於哪個標頭檔案:

下面正式介紹“利器”:

grep "memset" /usr/include/*.h

出來以下結果:
/usr/include/string.h:extern void *memset (void *__s, int __c, size_t __n) __THROW __nonnull ((1));
/usr/include/tiffio.h:extern void _TIFFmemset(void* p, int v, tmsize_t c);
/usr/include/wchar.h:extern wchar_t *wmemset (wchar_t *__s, wchar_t __c, size_t __n) __THROW;

於是我們根據查詢的結果可以確定缺少的標頭檔案為string.h

於是,原始檔補上#include <string.h>就不再報錯了。

 

下面推薦網上給出的常用檢索命令:

1.find

Linux下最強大的搜尋命令為”find“。它的格式為”find <指定目錄> <指定條件> <指定動作>“;例如:

find / -name  'interfaces'   //使用find命令搜尋在根目錄下的所有interfaces檔案所在位置

其他引數使用,請使用 man find 獲取幫助(小技巧:按下ctrl+f 可快進一頁檢視,ctrl+b 回退一頁

)。

2. grep

print lines matching a pattern,輸出匹配的檢索結果。

如:

grep "memset" /usr/include/*.h   // 使用grep命令過濾出/usr/include/目錄下所有後綴名為.h的標頭檔案含有memset的檔案所在行。

系統通用的規則有

*     匹配所有

?  匹配一個字元。

[ab]  匹配a或者b

[!a]   匹配非a

[a-z]  匹配符合a-z的字元

例如:

grep "m*set" /usr/include/*.h

發現結果很多,一直滾屏。

檢索結果帶分屏顯示:

grep "m*set" /usr/include/*.h   | more

小技巧:按 f 鍵前進一屏,按下 enter 前進一行,按下  q 退出分屏顯示。

不會回退顯示? 這麼強大的Linux怎麼可能做不到?!

grep  "m*set"  /usr/include/*.h  |  less

小技巧:按 f 鍵前進一屏,按下 b 回退一屏,d 鍵前進半屏,u 回退半屏  ,按下 enter或者e 前進一行 ,y 鍵回退一行,g檔案第一行  G檔案最後一行, 按下  q 退出分屏顯示。

再如:  grep "accept" /usr/include/*/*.h 

3.which

命令檢視系統命令是否存在,並返回系統命令所在的位置。

shows the full path of (shell) commands.

例如:

which cd

/usr/bin/cd

 

4.whereis

命令可以搜尋linux系統中的所有可執行檔案即二進位制檔案。
locates the binary, source and manual files for the specified command names.

例如:

whereis -b cd  //查詢二進位制檔案cd

cd: /usr/bin/cd

 

5.type

命令檢視系統中的某個命令是否為系統自帶的命令。

type cd

cd is a shell builtin   //cd 是 shell 內嵌