例如,在Zend PHP源代码中:
ZEND_API int _zend_get_parameters_array(int ht, int param_count, zval **argument_array TSRMLS_DC)
答案 0 :(得分:3)
此处,ZEND_API
是一个宏名称(之前使用#define
指令定义),由preprocessor扩展。它用于为所有Zend API函数的签名中使用的特定指令集建立有意义的速记;这有助于确保它们都不会遗漏,这会导致互操作代码出现问题。它也可以(并且,我认为,虽然我没有看过Zend源代码)用于抽象平台差异而不改变所有这些位置的代码。
答案 1 :(得分: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
的可见性设置表示可见。