2015-01-06 84 views

回答

3

這裏,ZEND_API是一個宏名稱(預先用#define指令定義),其由preprocessor擴大。它用於爲所有Zend API函數的簽名中使用的特定指令集建立有意義的簡寫;這有助於確保它們中的任何一個都不會離開,這會導致interop代碼出現問題。它也可以(並且,我認爲,儘管我沒有看過Zend的源代碼)用來抽象平臺差異而不改變所有這些位置的代碼。

+0

好吧,我有c項目的經驗,我知道了。定義 ZEND_API __declspec(dllexport) – memng

+0

我不確定這是否會回答這個問題。是的,它是宏,完整的答案會解釋它在函數定義之前的位置。 – robbmj

+0

@robbmj:夠公平的。怎麼樣? –

1

在像這樣的函數聲明前面使用宏用於指定某些平臺的調用約定。在ZEND_API的情況下,擴展到

__attribute__ ((visibility("default"))) 

告訴GCC 4,使_zend_get_parameters_array可見的其他庫。

函數通常是可見的,所以這個屬性通常是無操作的。但是,當-fvisibility=hidden傳遞給GCC時,默認情況下是隱藏函數,以便它們不能從其他庫中看到。 「可見」或「隱藏」描述函數是否會得到符號表條目。此屬性通過將函數標記爲可見來覆蓋-fvisibility=hidden的影響。

ZEND_API宏告訴GCC使_zend_get_parameters_array可見。 GCC通過將該函數的條目放入編譯庫的符號表中來實現這一點。如果沒有該宏,該函數將無法從另一個庫中調用。

有關GCC的visibility屬性的更多信息,請參閱Visibility

* default的可見度設置表示可見。

+0

許多宏像你說的像PHPAPI那樣定義,但是我不能在php-src目錄中找到像這樣的ZEND_API。它是通過config或makefile或gcc傳遞的。 – memng

+0

@memng'ZEND_API'好像是[由configure定義](http://stackoverflow.com/a/9124808/1422127) –

相關問題