1

C ライブラリをラップする Node.js 用の C++ モジュールを作成しているので、JavaScript から C ライブラリを使用できます。C ライブラリの関数の 1 つは、対応するヘッダー ファイルに含まれる列挙型の値を使用して、列挙型パラメーターを取ります。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.");

JS でLOGLEVEL_ERROR使用できるように C++ から公開するにはどうすればよいですか? logger.ERROR(私はJSでもOKですlogger.LOGLEVEL_ERROR。)マクロを使用する古い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 に答える