例如,在Zend PHP源:在函數定義之前添加全部關鍵字的含義是什麼?
ZEND_API int _zend_get_parameters_array(int ht, int param_count, zval **argument_array TSRMLS_DC)
例如,在Zend PHP源:在函數定義之前添加全部關鍵字的含義是什麼?
ZEND_API int _zend_get_parameters_array(int ht, int param_count, zval **argument_array TSRMLS_DC)
這裏,ZEND_API
是一個宏名稱(預先用#define
指令定義),其由preprocessor擴大。它用於爲所有Zend API函數的簽名中使用的特定指令集建立有意義的簡寫;這有助於確保它們中的任何一個都不會離開,這會導致interop代碼出現問題。它也可以(並且,我認爲,儘管我沒有看過Zend的源代碼)用來抽象平臺差異而不改變所有這些位置的代碼。
在像這樣的函數聲明前面使用宏用於指定某些平臺的調用約定。在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
的可見度設置表示可見。
許多宏像你說的像PHPAPI那樣定義,但是我不能在php-src目錄中找到像這樣的ZEND_API。它是通過config或makefile或gcc傳遞的。 – memng
@memng'ZEND_API'好像是[由configure定義](http://stackoverflow.com/a/9124808/1422127) –
如果我可以欺騙這個東西,我會,但我想這就是這是爲了。 –