2012-01-29 74 views
2

我是新來C.我是通過math.h中旅行,尋找它的數學算法,但只遇到這種線:理解C頭語法

_CRTIMP double __cdecl sin (double); 
_CRTIMP double __cdecl cos (double); 
... 

現在,我找不到算法本身。我知道_CRTIMP是C使用的一種運行時庫,但我無法弄清楚整條線的含義。你能解釋一下嗎?

此外,我想知道這些函數的定義在哪裏。

+1

第一次搜索的鏈接:http://objectmix.com/c/32997-whats-use-__cdecl.html和你的回答:'_CRTIMP只是一個宏,這可能會擴展到一些非標準的 調用約定規範或什麼也不做,具體取決於。 「CRT」 可能意味着「C運行時庫」。 「IMP」可能意味着「進口」。 __cdecl是一個由Visual C++支持的調用約定說明符,還有一些其他的Windows C++編譯器。 – Vyktor 2012-01-29 00:16:20

+0

我想,我還不夠清楚。 「cos(double)」存在於哪裏?函數本身在哪裏?順便說一句,我曾經訪問過這個鏈接) – 2012-01-29 00:18:49

+1

@MichaelSazonov頭文件只告訴你哪些函數和數據可用;定義本身是其他地方(在這個例子中的C標準庫(msvcrt32.dll或類似的東西)) – Dave 2012-01-29 00:27:05

回答

5

C頭文件一般只包含函數的原型聲明,不定義。函數原型指定了所謂的「函數簽名」:返回值,參數和有時調用約定(當編譯器支持這個時,&)。函數定義位於獨立的源文件中,與您自己分開編譯(包括源文件#include的任何頭文件)。庫函數的定義可能在C語言中,它們也可能在彙編中,但是這對你的代碼無關緊要(僅僅是爲了好奇)。但是你可能不會自己編譯這些;相反,您的開發環境/操作系統帶有一個包含許多已編譯功能的標準庫(二進制對象文件)。你的開發環境只需鏈接你的代碼到那個庫。

2

您的操作系統,編譯器或C運行時庫附帶的C頭文件並非真正用於人類消費。你當然可以閱讀它們,你可以通過試圖理解它們來學習,但它們主要是供編譯器使用的。正如你在這些例子中看到的那樣,它們往往依賴於許多編譯器特有的功能(你應該儘量避免在你自己的代碼中使用這種習慣)。

他們也傾向於有很多#ifdef s,所以相同的標題可以用於不同的系統。

例如,如果您只是想知道如何使用sin函數,您最好閱讀系統的文檔。在我的Ubuntu系統,例如,man sin顯示了這個(除其他事項外):

提要

#include <math.h> 

    double sin(double x); 
    float sinf(float x); 
    long double sinl(long double x); 

    Link with -lm. 

_CRTIMP__cdecl可能是編譯器很重要,但作爲一個程序員,你可以安全地忽略它們。

如果您正在尋找執行函數的源代碼,該函數可能可用,也可能不可用。它可能用C以外的語言編寫;甚至有系統在硬件上實現它(儘管仍然需要小包裝)。

另一個答案提供了一個實現的鏈接,但這可能不是您系統上使用的鏈接。

而且您不需要陷入太深陷入sin函數如何實現。這當然是一件好事,但你不需要這些信息來編寫使用它的代碼。 (我絕對是不要想要讓人好奇。)

+0

很好的答案!清晰而豐富!非常感謝你! – 2012-01-29 01:09:15