例如,在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) –
如果我可以欺骗这个东西,我会,但我想这就是这是为了。 –