2012-09-19 67 views
1

我正在为包装C库的Node.js编写一个C++模块,因此我们可以使用JavaScript中的C库。 C库中的一个函数需要一个枚举参数,枚举值包含在相应的头文件中。我想从C++模块中将枚举值作为整数导出,以便Node.js应用程序不必硬编码该值。这里的基本思想是:从Node.js导出整数值C++模块

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 ++这样我就可以使用logger.ERROR in JS? (我甚至会在JS logger.LOGLEVEL_ERROR确定。)我发现,使用宏EXPORT_INT32,但这似乎并不存在了一个旧的Node.js本机模块(我使用Node.js的0.8.8)。

回答

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

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

下面是相关部分:Converting Enums

希望这有助于一些,但最简单的途径将是刚刚宣布他们在JavaScript中。

+0

谢谢。我一直在使用V8Convert,但还没有看V8Juice,我会检查一下。虽然把值放在JS中可能会变成最简单的... – Zik