BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #83624同步于 2014/10/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

函数调用离得太远,居然会调用失败!

en911
2014/10/24镜像同步30 回复
今天在vs2012上写个代码玩儿,就是实现一个功能,把字符串转化为公式并计算出结果,比如输入“2+lg(100)*3” 便返回答案8。然后发现了一个之前没留意的问题。 我定义了两个函数,f1() 和 f2(),然后在f1()中调用 f2()。编译后报错,说 f1中“f2 identifier not found:”。我很奇怪,f2()明明定义了的呀!找错找了大半小时,才知道哪里错了。 原来我的.cpp文件写得比较大,大概600行,两个函数声明的地方离得太远了,所以调用不了。我把它们复制粘贴近一点,就成功了。感觉很黑线啊。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
karcy机器人#1 · 2014/10/24
是么?cpp才600行,哪里大了? 我觉得,你应该不是 在 .h 头文件中声明, 在.cpp中定义。应该是直接在.cpp中声明定义。 那这就得了。你在f1中调用f2,你要保证在f1之前f2已经声明过了。如果你f1调用f2,f2的声明定义都在f1之后,那肯定查找不到。 解决方法 一般是,在cpp的 文件的较上方 加一句f2的声明。 或者,养成好习惯,声明都写在h文件里。不过最近我也在改,有些静态函数我也不写在h里了,在cpp上方声明。这样在h里查找接口函数简单一点。 【 在 en911 (嘻嘻哈哈) 的大作中提到: 】 今天在vs2012上写个代码玩儿,就是实现一个功能,把字符串转化为公式并计算出结果,比如输入“2+lg(100)*3” 便返回答案8。然后发现了一个之前没留意的问题。 我定义了两个函数,f1() 和 f2(),然后在f1()中调用 f2()。编译后报错,说 f1中“f2 identifier not found:”。我很奇怪,f2()明明定义了的呀!找错找了大半小时,才知道哪里错了。 原来我的.cpp文件写得比较大,大概600行,两个函数声明的地方离得太远了,所以调用不了。我把它们复制粘贴近一点,就成功了。感觉很黑线啊。
en911机器人#2 · 2014/10/24
我去看了看,之前确实可能把f2的声明定义放在f1之后了,看来没有养成良好习惯啊。 我知道把f2的声明定义放在f1后面会导致出错,但我以为这时候vs2012会在调用f2时加个波浪线提醒我。我看到没有波浪线,以为f2就在f1前面... 【 在 karcy 的大作中提到: 】 : 是么?cpp才600行,哪里大了? : 我觉得,你应该不是 在 .h 头文件中声明, 在.cpp中定义。应该是直接在.cpp中声明定义。 : 那这就得了。你在f1中调用f2,你要保证在f1之前f2已经声明过了。如果你f1调用f2,f2的声明定义都在f1之后,那肯定查找不到。 : ...................
FromMars机器人#3 · 2014/10/24
尽量在文件头 先声明全部全局函数
nuanyangyang机器人#4 · 2014/10/24
楼主学Java吧,没这个问题。
gaoweiwei机器人#5 · 2014/10/24
跟文件大小目测没有关系
lovving机器人#6 · 2014/10/25
看到标题,我就笑了
aName机器人#7 · 2014/10/25
又是一个毁三观的结论 通过『我邮2.0』发布
cocoyimasa机器人#8 · 2014/10/25
单个CPP超过千行也没见过这种问题。C++的头文件还是挺有用的。
doug机器人#9 · 2014/10/25
噗。。。距离太远。。。。。 感觉两个寒暑再也不会爱了。。。 刚开始我以为是汇编的太远呢。。。。