在PHP源碼中,咱們能夠見到諸如PHPAPI ZEND_API TSRM_API等xxx_API(固然還有其餘格式的)這樣的宏函數
關於它們的定義都是相似於spa
#if defined(__GNUC__) && __GNUC__ >= 4 # define ZEND_API __attribute__ ((visibility("default"))) #else # define ZEND_API #endif
1、預約義__GNUC__宏code
1 __GNUC__ 是gcc編譯器編譯代碼時預約義的一個宏。須要針對gcc編寫代碼時, 能夠使用該宏進行條件編譯。blog
2 __GNUC__ 的值表示gcc的版本。須要針對gcc特定版本編寫代碼時,也能夠使用該宏進行條件編譯。編譯器
3 __GNUC__ 的類型是「int」,該宏被擴展後, 獲得的是整數字面值。能夠經過僅預處理,查看宏擴展後的文本。源碼
因此咱們知道ZEND_API定義爲:it
若是編譯器使用的是gcc且GNUC的版本大於等於4,則定義ZEND_API爲 __attribute__ ((visibility("default")))編譯
那__attribute__究竟是幹嗎的,有什麼做用呢?class
查閱關於C的相關資料得出結論:gcc
__attribute__ ((visibility("default")))定義的函數都是可見的
詳細的解釋能夠搜索相關內容