C++中 “Node未oracle必须声明标识符的标识符”

C++ 函数未声明标识符_百度知道
C++ 函数未声明标识符
y;a;&&lt,见笑了;& a:&quot,y):print(){ cout&private.func(x; return 0;&);&quot:;}void A?
&&& cout&lt,int);& cin&请输入一个整数;这样就好了;PAUSE&两数相乘积为;&int main(){ Ai*j&}void A,2);&lt?:&quot: inline void func(int:; inline void print():& j=y? 还有内联函数究竟是干什么用的; i=x.print();class A{&lt。 初学;&gt:&&&x;a。为什么改成&quot,int y){ cout&lt:func(这一句中报错说未声明标识符 但是我在下面声明了啊;&lt.func(x,j;iostream&endl.func(1;请输入另一个整数,y); cin& system (&&lt#include &}
提问者采纳
inline只是允许编译器对这个函数进行内联优化;
return 0;PAUSE&quot, 值是多少;&#47int main(){
A xy是什么;
a? 没有什么过),y);
system (&quot.func(x:, int还是double还是哪个变量;/
&#47,int y) &#47:func(} void A.print(), 没有半点关系 内联函数不需要去特殊理解; 这里的xy和main里面的除了名字一样
a.func(x,y);
里面调用的不就是void A::func(int x,int y) 的吗?? 但为什么我把a.func(x,y);
改成a.func(1,2);之后就可以随便算出我输入的两个数的乘积了? 而如果上面是a.func(1,2);下面是void A::func(int x,int y) ;这样,再改成void A::func(int x=1,int y=2);就会提示“A::func”: 函数不接受 0 个参数?
问题比较多。麻烦了。
从基本函数开始说吧.. 汗.. int sum(int a, int b){
return a+b;}看以上这个函数, 函数名是sum, 接受2个int类型的参数, 返回两个参数的和. 使用时:int main(){
int x = 1;
int y = 2;
cout && &x+y等于是: & && sum(x,y) &&
// 参数是x和y
cout && &1+2等于是: & && sum(1,2) &&
// 参数是1和2
cout && &y+3等于是: & && sum(y,3) &&
// 参数是y和3} 再看你的代码:int main{
a.func(1,2); // 1和2都是int类型, 参数符合
a.func(x ,y); // xy在哪, 编译器找不到啊!..} 改成int main{
int x = 10;
int y = 20;
a.func(x ,y); // xy有定义, 一个10, 一个20} void A::func(int x,int y) 这里的x和y同main上面定义的没有关系, 只要你愿意所有的参数都可以起名为x, y void A::func(int x=1,int y=2)在函数的参数表里像这样直接指定=某个值, 表示&默认参数&, 意思是说如果你不写这个参数, 就会用等号后面的值当做默认值 比如a.func(100); // 只写了一个参数, 后面一个默认为2, 等价于func(100, 2)a.func(); // 2个都没写, 全部使用默认值, 等价于 func(1,2) LZ的关于函数参数和变量的基本概念还没有理解.
其他类似问题
为您推荐:
其他1条回答
定义全局变量就可以实现全局调用了。class A{/&#47,y,func()函数和main()函数就能公用这个x,y变量了,变量就消失了在函数内声明的变量作用域只存在于函数内部。比如;using namespace std,函数结束;定义为全局变量; /&#47:#include&iostream&gt
那如果上面是a.func(1,2);下面是void A::func(int x,int y) ;这样,再改成void A::func(int x=1,int y=2);就会提示“A::func”: 函数不接受 0 个参数是怎么回事?
你函数声明和定义不匹配当然会提示出错了啊。
标识符的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁error C2065: “constexpr”: 未声明的标识符?
如何解释在VS2013中运用constexpr会报错。
按投票排序
VS 2015可以支持了,可以在上试试。
知乎彻底沦陷!
已有帐号?
无法登录?
社交帐号登录关于C++“未声明的标识符”的问题。_百度知道
关于C++“未声明的标识符”的问题。
提问者采纳
删掉 `TEXT(` 和对应的 `)`
ShellExecute(NULL,TEXT(&open&),str,NULL,NULL,1);
那是前一行声明的错char&str[30]&=&&blahblah&;是个窄字符串,你的工程被配置成使用 Unicode 字符串,所以需要使用wchar_t&str[30]&=&L&blahblah&;如果要使代码在使用窄字符串和使用 Unicode 字符串时都能通过,要用TCHAR&str[30]&=&TEXT(&blahblah&);
提问者评价
其他类似问题
为您推荐:
标识符的相关知识
其他2条回答
ShellExecuteA(0,&&open&,&&,&0,&0,&3);
楼上的是正解
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁急!编译后:未声明的标识符
[问题点数:20分,结帖人eniyi]
急!编译后:未声明的标识符
[问题点数:20分,结帖人eniyi]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2009年4月 总版技术专家分月排行榜第一
2009年11月 Linux/Unix社区大版内专家分月排行榜第一2009年6月 Linux/Unix社区大版内专家分月排行榜第一2009年4月 C/C++大版内专家分月排行榜第一2009年3月 C/C++大版内专家分月排行榜第一2009年3月 Linux/Unix社区大版内专家分月排行榜第一2009年2月 Linux/Unix社区大版内专家分月排行榜第一
本帖子已过去太久远了,不再提供回复功能。用C/C++来实现 Node.js 的模块(一)
投稿:hebedich
字体:[ ] 类型:转载 时间:
这篇文章的主要内容其实简而言之就是——用C/C++来实现 Node.js 的模块,非常的不错,有需要的朋友可以参考下
 N久之前的一个坑——用 Node.js 来重构 NBUT 的 Online Judge,包括评测端也得重构一遍。(至于什么时候完成大家就不要关心了,(/‵Д′)/~ ╧╧
  总之我们现在要做的其实简而言之就是——用C/C++来实现 Node.js 的模块。
  工欲善其事,必先~~耍流氓~~利其器。
  首先你需要一个 node-gyp 模块。
  在任意角落,执行:
$ npm install node-gyp -g
&  在进行一系列的 blahblah 之后,你就安装好了。
  然后你需要有个 python 环境。
  自己去官网搞一个来。
注意: 根据 node-gyp 的GitHub显示,请务必保证你的 python 版本介于 2.5.0 和 3.0.0 之间。
  嘛嘛,我就偷懒点不细写了,还请自己移步到 node-gyp 去看编译器的需求。并且倒腾好。
  我就拿官网的入门 Hello World说事儿了。
Hello World
  请准备一个 C++ 文件,比如就叫 ~~sb.cc~~ hello.cc。
  然后我们一步步来,先往里面搞出头文件和定义好命名空间:
#include &node.h&
#include &v8.h&
using namespace v8;
  接下去我们写一个函数,其返回值是 Handle&Value&。
Handle&Value& Hello(const Arguments& args)
&&& //... 嗷嗷待写
&  然后我来粗粗解析一下这些东西:
Handle&Value&
  做人要有节操,我事先申明我是从这里(@fool)参考的。
V8 里使用 Handle 类型来托管 JavaScript 对象,与 C++ 的 std::sharedpointer 类似,Handle 类型间的赋值均是直接传递对象引用,但不同的是,V8 使用自己的 GC 来管理对象生命周期,而不是智能指针常用的引用计数。
JavaScript 类型在 C++ 中均有对应的自定义类型,如 String 、 Integer 、 Object 、 Date 、 Array 等,严格遵守在 JavaScript 中的继承关系。 C++ 中使用这些类型时,必须使用 Handle 托管,以使用 GC 来管理它们的生命周期,而不使用原生栈和堆。
  而这个所谓的 Value ,从 V8 引擎的头文件 v8.h 中的各种继承关系中可以看出来,其实就是 JavaScript 中各种对象的基类。
  在了解了这件事之后,我们大致能明白上面那段函数的申明的意思就是说,我们写一个 Hello 函数,其返回的是一个不定类型的值。
注意: 我们只能返回特定的类型,即在 Handle 托管下的 String 啊 Integer 啊等等等等。
  这个就是传入这个函数的参数了。我们都知道在 Node.js 中,参数个数是乱来的。而这些参数传进去到 C++ 中的时候,就转变成了这个 Arguments 类型的对象了。
  具体的用法我们在后面再说,在这里只需要明白这个是个什么东西就好。(为毛要卖关子?因为 Node.js 官方文档中的例子就是分开来讲的,我现在只是讲第一个 Hello World 的例子而已( &థ౪థ)σ
  接下去我们就开始添砖加瓦了。就最简单的两句话:
Handle&Value& Hello(const Arguments& args)
&&& HandleS
&&& return scope.Close(String::New("world"));
&  这两句话是什么意思呢?大致的意思就是返回一个 Node.js 中的字符串 "world"。
HandleScope
  同参考自这里。
Handle 的生命周期和 C++ 智能指针不同,并不是在 C++ 语义的 scope 内生存(即{} 包围的部分),而需要通过 HandleScope 手动指定。HandleScope 只能分配在栈上,HandleScope 对象声明后,其后建立的 Handle 都由 HandleScope 来管理生命周期,HandleScope 对象析构后,其管理的 Handle 将由 GC 判断是否回收。
  所以呢,我们得在需要管理他的生命周期的时候申明这个 Scope 。好的,那么为什么我们的代码不这么写呢?
Handle&Value& Hello(const Arguments& args)
&&& HandleS
&&& return String::New("world");
&  因为当函数返回时,scope 会被析构,其管理的Handle也都将被回收,所以这个 String 就会变得没有意义。
  所以呢 V8 就想出了个神奇的点子——HandleScope::Close(Handle&T& Value) 函数!这个函数的用处就是关闭这个 Scope 并且把里面的参数转交给上一个 Scope 管理,也就是进入这个函数前的 Scope。
  于是就有了我们之前的代码 scope.Close(String::New("world"));。
String::New
  这个 String 类所对应的就是 Node.js 中原生的字符串类。继承自 Value 类。与此类似,还有:
&•Array
•Integer
•Boolean
•Object
•Date
•Number
•Function
•...
  这些东西有些是继承自 Value,有些是二次继承。我们这里就不多做研究,自己可以看看 V8 的代码(至少是头文件)研究研究或者看看这个手册。
  而这个 New 呢?这里可以看的。就是新建一个 String 对象。
  至此,这个主要函数我们就解析完毕了。
  我们来温习一下,如果是在 Node.js 里面写的话,我们怎么导出函数或者对象什么的呢?
exports.hello = function() {}
&  那么,在 C++ 中我们该如何做到这一步呢?
初始化函数
  首先,我们写个初始化函数:
void init(Handle&Object& exports)
&&& //... 嗷嗷待写你妹啊!#゚&A゚)⊂彡☆))゚Д゚)・∵
&  这是龟腚!函数名什么的无所谓,但是传入的参数一定是一个 Handle&Object&,代表我们下面将要在这货上导出东西。
  然后,我们就在这里面写上导出的东西了:
void init(Handle&Object& exports)
&&& exports-&Set(String::NewSymbol("hello"),
&&&&&&& FunctionTemplate::New(Hello)-&GetFunction());
&  大致的意思就是说,为这个 exports 对象添加一个字段叫 hello,所对应的东西是一个函数,而这个函数就是我们亲爱的 Hello 函数了。
  用伪代码写直白点就是:
void init(Handle&Object& exports)
&&& exports.Set("hello", function hello);
&  大功告成!
  (大功告成你妹啊!闭嘴( ‘д‘⊂彡☆))Д&)
  这才是最后一步,我们最后要申明,这个就是导出的入口,所以我们在代码的末尾加上这一行:
NODE_MODULE(hello, init)
&  纳了个尼?!这又是什么东西?
  别着急,这个 NODE_MODULE 是一个宏,它的意思呢就是说我们采用 init 这个初始化函数来把要导出的东西导出到 hello 中。那么这个 hello 哪来呢?
  它来自文件名!对,没错,它来自文件名。你并不需要事先申明它,你也不必担心不能用,总之你的这个最终编译好的二进制文件名叫什么,这里的 hello 你就填什么,当然要除去后缀名了。
  详见官方文档。
Note that all Node addons must export an initialization function:
void Initialize (Handle&Object& exports);
NODE_MODULE(module_name, Initialize)
&There is no semi-colon after NODE_MODULE as it's not a function (see node.h).
The module_name needs to match the filename of the final binary (minus the .node suffix).
编译 (๑•́ ₃ •̀๑)
  来吧,让我们一起编译吧!
  我们再新建一个类似于 Makefile 的归档文件吧——binding.gyp。
  并且在里面添加这样的代码:
& "targets": [
&&&&& "target_name": "hello",
&&&&& "sources": [ "hello.cc" ]
&  为什么这么写呢?可以参考 node-gyp 的官方文档。
  在文件搞好之后,我们要在这个目录下面执行这个命令了:
$ node-gyp configure
&  如果一切正常的话,应该会生成一个 build 的目录,然后里面有相关文件,也许是 M$ Visual Studio 的 vcxproj 文件等,也许是 Makefile ,视平台而定。
  Makefile 也生成好之后,我们就开始构造编译了:
$ node-gyp build
&  等到一切编译完成,才算是真正的大功告成了!不信你去看看 build/Release 目录,下面是不是有一个 hello.node 文件了?没错,这个就是 C++ 等下要给 Node.js 捡的肥皂!
搞基吧!Node ヽ(✿゚▽゚)ノ C++
  我们在刚才那个目录下新建一个文件 jianfeizao.js:
var addon = require("./build/Release/hello");
console.log(addon.hello());
&  看到没!看到没!出来了出来了!Node.js 和 C++ 搞基的结果!这个 addon.hello() 就是我们之前在 C++ 代码中写的 Handle&Value& Hello(const Arguments& args) 了,我们现在就已经把它返回的值给输出了。
洗洗睡吧,下节更深入
  时间不早了,今天就写到这里了,至此为止大家都能搞出最基础的 Hello world 的 C++ 扩展了吧。下一次写的应该会更深入一点,至于下一次是什么时候,我也不知道啦其实。
&  (喂喂喂,撸主怎么可以这么不负责!(o゚ロ゚)┌┛Σ(ノ&ω`)ノ
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 未声明的标识符 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信