比较v8字符串(Node.js插件)

时间:2017-01-03 23:25:39

标签: c++ v8

我有这个:

  if (!args[2]->IsString() || (*args[2]->ToString() != "true" && *args[2]->ToString() != "false")) {
        Nan::ThrowTypeError("Third argument to 'replace-line' must be a string representing whether to find or replace.");
        return;
    }

但是我收到了编译错误和警告:

../hello.cpp:49:58: error: comparison between distinct pointer types ‘v8::String*’ and ‘const char*’ lacks a cast [-fpermissive]
../hello.cpp:49:92: warning: comparison with string literal results in unspecified behaviour [-Waddress]
     if (!args[2]->IsString() || (*args[2]->ToString() != "true" && *args[2]->ToString() != "false")) {

如何正确地将v8字符串与普通C字符串进行比较?

3 个答案:

答案 0 :(得分:0)

您可以使用v8::String::NewFromOneByte详细in the documentation进行转换。如果您愿意,还可以使用其他来源。

如果你想走另一条路,看起来你必须创建自己的缓冲区并使用WriteOneByte

答案 1 :(得分:0)

您可以构建v8::String::Utf8Value之类SLS=figure(); hold on subplot(3,2,1); plot(t,u{1},t,u{2},t,u{3},t,u{4},t,u{5},t,u{6}); title('SLS Levels'); subplot(3,2,2); plot(t,log_u{1},t,log_u{2},t,log_u{3},t,log_u{4},t,log_u{5},t,log_u{6}); title('SLS Logarithms'); subplot(3,2,3); plot(t,I_u{1},t,I_u{2},t,I_u{3},t,I_u{4},t,I_u{5},t,I_u{6}); title('SLS Levels with Intercept'); subplot(3,2,4); plot(t,log_I_u{1},t,log_I_u{2},t,log_I_u{3},t,log_I_u{4},t,log_I_u{5},t,log_I_u{6}); title('SLS Log. with Intercept'); subplot(3,2,5.5); legend('GDP', 'C', 'I', 'G', 'Imp.', 'Exp.'); axis off 并将其与C字符串文字进行比较(事件虽然使用v8::String::Utf8Value arg(args[2]->ToString())代替strcmp/strncmp,但可以构建==它)。

答案 2 :(得分:0)

V8 适用于Javascript

你如何正确地比较Javascript中的两个字符串?

"String 1" === "String 2"

你如何正确地比较Javascript中的两个值?

value1 === value2

===的魔力在C ++中也可用

不要提取内部字符值进行比较。 比较(===v8::Value s。

假设args[2]v8::Local<v8::Value>而不是空句柄,您可以这样做:

Isolate *isolate = Isolate::GetCurrent();
v8::Local<v8::String> h_true = v8::String::NewFromUtf8(isolate, "true");
v8::Local<v8::String> h_false = v8::String::NewFromUtf8(isolate, "false");
if(args[2]->StrictEquals(h_true) || args[2]->StrictEquals(h_false) == false)
{
    v8::Local<v8::String> h_error_message = v8::String::NewFromUtf8(
        isolate,
        "The argument must be a \"true\" or a \"false\"."
    );
    v8::Local<v8::Error> h_error = v8::Exception::RangeError(h_error_message);
    isolate->ThrowException(h_error);
    return;
}

但是,由于你正在使用 Nan ,事情可以简单得多:

if(info[2]->StrictEquals(Nan::New("true")) // arguments[2] === "true"
|| info[2]->StrictEquals(Nan::New("false")) // arguments[2] === "false"
== false)
{
    Nan::ThrowRangeError("The argument must be a \"true\" or a \"false\".");
    return;
}

您甚至不必检查参数是否为字符串,也不是由调用者提供。