簡體   English   中英

如何確定函數來自哪個頭文件?

[英]How to determine which include header file a function comes from?

學習新函數時,我喜歡在調用新函數時包含全名(例如, std::cin而不是cin )。 有沒有類似的方法可以包含函數來自的標頭? 例如,有沒有一種方法可以指定排序函數是來自<algorithm>頭,而不是<iomanip>頭,還是其他?

舉例來說,這將是冷靜,如果我可以打電話sort使用類似std::algorithm::sort ,而不是std::sort 標准庫中內置的頭很多,僅使用std::*實際上並不能提供足夠的信息,並且很少告訴我*的來源。

顯然,隨着我對C ++的了解,這可能不是必需的,但是我的目標是了解哪些函數與哪些標頭一起使用,以便更好地學習標准庫。

如果沒有這種方法來指定函數,是否可以使用函數確定提供該函數的標頭?

最終,我認為列出與每個標頭相關的將要使用的函數將是一種很好的編碼實踐:

#include <iostream>  //std::cout, std::cin

這樣人們就可以弄清楚從何而來! 鑒於c ++社區對名稱的清晰了解令人欽佩,為什么還不做更多呢?

注意:僅因為C ++是一種非Pythonic語言,所以才可能出現此問題。 畢竟,“顯式勝於隱式”。 :)

例如,有沒有一種方法可以指定排序函數是來自<algorithm>頭,而不是<iomanip>頭,還是其他?

否。C++作為一種編譯語言(故意忽略預處理器)不了解標題的文件名,因此,它們與標題中定義的對象名稱和類型無關。

如果有幫助, <iomanip>沒有std::sort

想做的事也很奇怪。 通過匹配參數類型來執行重載解析,這足以消除歧義。

例如,如果我可以使用std::algorithm::sort東西代替std::sort來進行std::algorithm::sort ,那將很酷。 標准庫中內置的頭很多,僅使用std::*實際上並不能提供足夠的信息,並且很少告訴我*的來源。

沒關系 您無需知道其來源。 編譯器不需要知道它來自哪里。 與實際使用 std::sort完全無關。

的確 ,C ++標准庫沒有組織其內容分成許多子命名空間,而不是與頂級堅持::std大部分。 可以爭辯說,這使使用標准庫進行編碼更像是一個謎,但實際上並非如此:這只會使查找規則復雜化,並且在處理運算符重載,模板實例化和friend s。

最終,我認為列出與每個標頭相關的將要使用的函數將是一種很好的編碼實踐:

 #include <iostream> //std::cout, std::cin 

這樣人們就可以弄清楚從何而來! 鑒於c ++社區對名稱的清晰了解令人欽佩,為什么還不做更多呢?

雖然我對某些POSIX / Linux套接字標頭進行了此操作,以使我知道將來可以刪除哪些標頭,但我不會對標准標頭進行此操作。 C ++社區知道在哪里聲明了std::cout ,如果他們忘記了,就可以簡單地查找它。

我從未聽說有人想要這樣的東西。

您可以做的一件事(這很繁瑣,所以我認為這不值得)是創建自己的名稱空間,並在該名稱空間中為所需的每個名稱using declarations

#include <iostream>

namespace iostream {
    using std::cout;
    using std::endl;
}

int main() {
    iostream::cout << 24 << iostream::endl;
    return 0;
}

我的建議是盡管不要這樣做。 只需按它們的名字使用它們,然后在每次不確定它們來自何處時都在網上搜索。 隨着時間的流逝,您將毫不費力地學習它們。

指定或確定函數來自哪個頭文件的方法?

通常在遇到問題時會這樣做,例如嘗試找出為什么缺少符號或在何處發生標題沖突。 正如Orbit和Bolov指出的Lightness Races,這通常不是在運行時執行的操作。

但是,如果要執行此操作,請執行以下操作:

gcc -E t.c

如果tc是:

$ cat t.c
#include <stdio.h>

int main(int argc, char* argv[])
{
    return 0;
}

輸出將類似於:

$ gcc -E t.c
# 1 "t.c"
# 1 "<command-line>"
# 1 "t.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 28 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 323 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/predefs.h" 1 3 4
# 324 "/usr/include/features.h" 2 3 4
# 356 "/usr/include/features.h" 3 4
...
# 866 "/usr/include/stdio.h" 3 4
extern FILE *popen (__const char *__command, __const char *__modes) ;
extern int pclose (FILE *__stream);
extern char *ctermid (char *__s) __attribute__ ((__nothrow__));
# 906 "/usr/include/stdio.h" 3 4
extern void flockfile (FILE *__stream) __attribute__ ((__nothrow__));
extern int ftrylockfile (FILE *__stream) __attribute__ ((__nothrow__)) ;
extern void funlockfile (FILE *__stream) __attribute__ ((__nothrow__));
# 936 "/usr/include/stdio.h" 3 4

# 2 "t.c" 2

int main(int argc, char* argv[])
{
 return 0;
}

然后,通過grep傳遞輸出以找到所需的函數。

暫無
暫無

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

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