1

我正在为 Node.js 编写一个包含 C 库的 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);
}

节点.js:

// This is what I want:
logger.write(logger.ERROR, "Oh no!  Something bad happened.");

如何LOGLEVEL_ERROR从 C++ 中公开以便可以logger.ERROR在 JS 中使用?(我什至可以logger.LOGLEVEL_ERROR在 JS 中使用。)我发现了一个使用宏的旧 Node.js 本机模块,EXPORT_INT32但这似乎不再存在(我使用的是 Node.js 0.8.8)。

4

2 回答 2

2

将数字包装起来,如下所示:

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 Juice

这是相关部分:转换枚举

希望这对一些人有所帮助,但最简单的方法是在 JavaScript 中声明它们。

于 2012-09-19T18:43:37.947 回答
1

这就是我最终做的事情:

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.

于 2013-01-03T18:52:35.863 回答