从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