在函数定义之前添加all-caps关键字的含义是什么?

时间:2015-01-06 03:03:35

标签: c syntax

例如,在Zend PHP源代码中:

ZEND_API int _zend_get_parameters_array(int ht, int param_count, zval **argument_array TSRMLS_DC) 

2 个答案:

答案 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的可见性设置表示可见。