2015-01-06 50 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) –

相关问题