此代码编译完美:
if ( args.Length() > 0 ) {
if ( args[0]->IsString() ) {
String::Utf8Value szQMN( args[0]->ToString() ) ;
printf( "(cc)>>>> qmn is [%s].\n", (const char*)(* szQMN) ) ;
} ;
} ;
但是这个没有:
if ( args.Length() > 0 ) {
if ( args[0]->IsString() ) {
String::Utf8Value szQMN( args[0]->ToString() ) ; // <<<< (A)
} ;
} ;
printf( "(cc)>>>> qmn is [%s].\n", (const char*)(* szQMN) ) ; // <<<< (B)
错误说:“错误C2065:'szQMN':未声明的标识符”在线(B)
这对我来说意味着标有(A)的句子是同时作为分配的定义,对吗?
并且编译器决定它是“有条件”定义的,因为它在两个“IF”中?
我的问题是:如何将声明移出两个“IF”?
通过这种方式,我也可以给它一个defalut值......万一IF失败。
如果我从两个“IF”中写出这一行
String::Utf8Value szQMN ("") ;
...然后我收到错误:
cannot convert argument 1 from 'const char [1]' to 'v8::Handle<v8::Value>'
有什么想法吗?
答案 0 :(得分:1)
这对我来说意味着标有(A)的句子是同时作为分配的定义,对吗?
从技术上讲,它是一个构造函数调用,它创建一个变量并对其进行初始化。
另请注意,自动变量仅存在于范围的末尾(通常是{}括号内的块)。这就是你的第二个代码示例无法编译的原因。
if (condition)
{
int x = 5;
}
x = 6; // error, x does not exist anymore
我的问题是:如何将声明移出两个“IF”?
String::Utf8Value szQMN ("");
这是类String::Utf8Value
类的构造函数调用。从错误消息中获取类型为v8::Handle<v8::Value>
的参数。不知道这是什么我不能给你一个答案如何称呼它。您希望传递""
或const char*
类型的const char[1]
,并且编译器告诉您它不接受该参数。
修改强>
从评论中提供的DeepBlackDwarf链接,您可以从字符串创建Utf8Value:
std::string something("hello world");
Handle<Value> something_else = String::New( something.c_str() );
所以在你的情况下你会这样做:
String::Utf8Value szQMN (String::New(""));
答案 1 :(得分:0)
IF循环中的定义仅适用于此循环。 所以在(B)句中,定义已经过期了。 如果你需要在IF循环和外部使用var,你可以用这句话来声明全局变化:
extern String :: Utf8Value szQMN(args [0] - &gt; ToString());