了解Node.js的napi_value类型的定义

时间:2019-10-21 16:05:44

标签: c++ c node.js

我看了看表头内部的内容,以了解类型napi_value的实际实现方式,我一点也不了解。 (我的C&C ++知识有限)能否请您帮我了解最新情况?

>> node_api.h
...
#include "napi_types.h"
...
typedef napi_value (*napi_addon_register_func)(napi_env env,
                                           napi_value exports);
...

>> node_api_types.h
...
// JSVM API types are all opaque pointers for ABI stability
// typedef undefined structs instead of void* for compile time type safety
typedef struct napi_value__ *napi_value;
...
typedef napi_value (*napi_callback)(napi_env env,
                                napi_callback_info info);

这让我很困惑...第一种和第三种typedef对我来说就像函数签名一样,除了名称是指针,即我对函数签名的想法是这样的:

typedef void function_SIG(void *a,void *b);
function_SIG *functionA_ptr; 
function_SIG *functionB_ptr;

该源可在github上找到:

https://github.com/nodejs/node/blob/master/src/node_api.h https://github.com/nodejs/node/blob/master/src/node_api_types.h


我下载了整个存储库(https://github.com/nodejs/node)并搜索了napi_value__,但它只找到了一个参考...也许是用某些V8引擎的东西编译的?

3 个答案:

答案 0 :(得分:1)

第一个和第三个未定义napi_value。第一个定义napi_addon_register_func。第三个定义napi_callback

此行:

typedef struct napi_value__ *napi_value;

napi_value定义为指向struct napi_value__的指针。


“不透明”(通常)表示该结构是在库中定义的,而不是在头文件中定义的。您可以具有未定义结构的指针。

答案 1 :(得分:1)

typedef napi_value (*napi_addon_register_func)(napi_env env,
                                           napi_value exports);

是别名声明napi_addon_register_func的声明,该别名用于指向具有返回类型napi_value和两个类型分别为napi_envnapi_value的函数的指针类型。

要使此声明更简单,您可以将其作为别名声明用C ++(不是C)重写

using napi_addon_register_func = napi_value ( * )(napi_env env, napi_value exports);

对于此typedef同样有效

typedef napi_value (*napi_callback)(napi_env env,
                                napi_callback_info info);

也就是说,它还为返回类型为napi_callback的函数指针和两个类型为napi_valuenapi_env的参数声明别名napi_callback_info

对于这种typedef

typedef struct napi_value__ *napi_value;

然后,为指向类型napi_value的结构的类型指针声明别名struct napi_value__

这些声明

typedef void function_SIG(void *a,void *b);
function_SIG *functionA_ptr; 
function_SIG *functionB_ptr;

如果要为函数的类型指针引入别名,则应像这样

typedef void function_SIG(void *a,void *b);
typedef function_SIG *functionA_ptr; 

答案 2 :(得分:1)

typedef struct napi_value__ *napi_value;

napi_value定义为struct napi_value__*的类型别名。 *的位置是有效的,但由于它是类型的一部分而不是类型名称,因此使IMO感到困惑。喜欢:

typedef struct napi_value__* napi_value;

定义

typedef napi_value (*napi_callback)(napi_env env, napi_callback_info info);

定义类型napi_callback,它是指向返回napi_value并分别采用类型napi_envnapi_callback_info的函数的指针。例如,给定一个函数:

napi_value someFunction( napi_env env, napi_callback_info info ) ;

您可以创建一个指针:

napi_callback mycallback = someFunction ;

然后可以通过以下方式调用回调:

mycallback( env, info ) ;

(除其他外)这是一种库链接到在构建库时未知的用户提供的代码的方法。

typedef napi_value (*napi_addon_register_func)(napi_env env, napi_value exports);

是另一种类型为napi_addon_register_func的函数指针类型,它是指向带有napi_value的{​​{1}}和napi_env类型参数的函数指针。