2011-02-16 69 views
5

我一直在閱讀stdio.h文件和Im困惑。函數聲明的含義

例如,有這樣一行:

_CRTIMP FILE* __cdecl __MINGW_NOTHROW fopen (const char*, const char*); 

我知道「FILE *」表示返回類型,我發現taht _CRTIMP是不變的定義爲

# ifndef _CRTIMP 
# define _CRTIMP __declspec(dllimport) 
# endif 

,但我不無論如何理解,它有什麼用途?什麼是字符串的其餘部分(__cdecl,__MINGW_NOTHROW)?

回答

5

__declspec(dllimport)指定該函數是從單獨的dll導入的;我想,根據CRT的靜態/動態鏈接設置,它有不同的定義。

__cdecl是用於該功能的調用約定;調用約定告訴編譯器如何調用函數(在哪個順序中將參數壓入堆棧,如果有任何寄存器用於參數,存儲返回值,誰負責堆棧清理,...... );一般來說,只要你不寫庫,你不應該擔心它。

__MINGW_NOTHROW#define d擴展到__attribute__ ((__nothrow__)),這是一個MinGW特定的擴展,它告訴編譯器該函數不會拋出異常;這可以讓編譯器執行一些優化。

請注意,所有這些都不是標準C屬性,而是編譯器/平臺特定的東西。再說一次,你不應該擔心它們,它們需要使CRT工作正常,但只要你不建立圖書館,你可以在不知道任何關於它們的情況下逃脫。:)

1

__declspec(dllimport)告訴編譯器該函數需要從DLL導入,這是一個Windows特定的擴展。詳情請參閱this page

同樣,__cdecl是一個屬性,指定該函數使用特定的調用約定(即由C使用的約定)。見this page

我猜想__MINGW_NOTHROW宏是GCC nothrow屬性的同義詞,它通知編譯器該函數不能拋出異常。有關詳細信息,請參閱documentation

0

這些是特定於環境或您正在使用的編譯器的聲明。

  • __declspec(dllimport)在windows上表示該函數在dll中,應該放在生成的可執行PE文件的導入表中。
  • __cdecl表示標準C調用約定,並將修改編譯器轉換函數以符合此調用約定的方式。
  • __MINGW_NOTHROW特定於您的編譯器,可能會取消激活對異常的支持。

在所有情況下,在編譯器的文檔中必須有解釋。

4

你應該看看_mingw.hgcc manual:在GCC的情況下 - 或任何其他編譯器支持__GNUC__ - 以下定義:

#define __cdecl __attribute__ ((__cdecl__)) 
#define __MINGW_NOTHROW __attribute__ ((__nothrow__)) 

前者告訴編譯器使用cdecl 86調用約定(see gcc manual),後者該函數保證不會拋出C++異常(see gcc manual)。

__declspec(dllimport)必要使動態鏈接工作(see gcc manual)。