从Node.js C ++模块导出整数值
我正在为包装C库的Node.js编写一个C ++模块,因此我们可以使用JavaScript中的C库。 C库中的一个函数需要一个枚举参数,枚举值包含在相应的头文件中。 我想从C ++模块导出枚举值作为整数,所以Node.js应用程序将不必硬编码值。 这里是基本的想法:
C:
typedef enum { LOGLEVEL_ERROR = 0, LOGLEVEL_WARN, LOGLEVEL_INFO } log_level_t; write_to_log(log_level_t level, char* message);
C ++:
Logger::Write(int level, char* message) { write_to_log(level, message); }
Node.js的:
// This is what I want: logger.write(logger.ERROR, "Oh no! Something bad happened.");
如何从C ++公开LOGLEVEL_ERROR
,这样我可以在JS中使用logger.ERROR
? (我甚至可以在JS中使用logger.LOGLEVEL_ERROR
)。我发现了一个旧的Node.js本地模块,它使用了一个macrosEXPORT_INT32
但是这似乎不再存在了(我正在使用Node.js 0.8.8)。
包装数量,像这样:
HandleScope scope; /** method code here **/ Local<Number> num = Number::New(5); return scope.Close(num);
以我的模块kexec
为例: https : //github.com/jprichardson/node-kexec/blob/master/src/kexec.cc
编辑:哦,我没有完全清楚你的问题。 我会在JS中声明这些值。
编辑2:经过进一步检查,似乎可能有点难受,但可能。 看来你可能想使用V8果汁 。
这里是相关部分: 转换枚举
希望这有助于一些,但最简单的路线是只要在JavaScript中声明它们。
这就是我最终做的事情:
Local<Object> instance = constructor->NewInstance(2, argv); Local<Object> logLevel = Object::New(); logLevel->Set(String::NewSymbol("ERROR"), cvv8::CastToJS(LOGLEVEL_ERROR), ReadOnly); logLevel->Set(String::NewSymbol("WARN"), cvv8::CastToJS(LOGLEVEL_WARN), ReadOnly); logLevel->Set(String::NewSymbol("INFO"), cvv8::CastToJS(LOGLEVEL_INFO), ReadOnly); instance->Set(String::NewSymbol("Level"), logLevel, ReadOnly);
然后从JavaScript可以访问logger.Level.ERROR
。