调用未声明的函数,为何会因此参数传递错误?

yueyucanyang 2010-06-13 02:16:27
编译环境VC6.0

最近测试一段代码,B函数调用A函数,发现函数A()参数传递总是出现错误,调用A函数之前所有参数都是正确,进入A函数时,参数就变成错误了,后来检查发现,在B函数之前未做A函数的声明,当声明之后,参数传递就正确了,请问,这个该如何解释?
...全文
333 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
yingziqdk 2010-10-18
  • 打赏
  • 举报
回复
这个问题确实存在,在有些编译器连警告都不会有,今天我用TI 的CCS3.3编译时就碰到这个问题,没有警告,没有提示错误,但参数传递不过去(定义函数时的参数类型和调用时的参数类型不同就会出错,类型相同时就没用问题,定义和调用是在两个不同的文件中),C51似乎有同样的问题。
风中之哨 2010-07-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 freezezdj 的回复:]

没声明,C会根据你传入的参数给你默认一个。
当你传入的参数可能需要隐式转换成你定义的函数参数时候。
程序就可能出问题。

C++没声明,报错。
[/Quote]

这个所谓的默认参数到底是什么类型的????我曾经猜测是int, 因为只有int 和 指针类型是不会出错的。
yueyucanyang 2010-06-29
  • 打赏
  • 举报
回复
我还要说一下,我结贴给分的未必是正确的言论,只不过人家进行试验验证了。发此回复,防止误导其他人。
yueyucanyang 2010-06-29
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 freezezdj 的回复:]
楼主该虚心向taodm学习!
[/Quote]

只要大家说的正确,我都是会去学习的,不管级别有多少。星多未必代表言论正确,有时候反而我发现有些低级别的人更加谦虚谨慎,回答的更是热心到位。
走好每一步 2010-06-14
  • 打赏
  • 举报
回复
其实警告隐伏着错误的,我不会在warning没改正之前将程序跑起来。
cattycat 2010-06-13
  • 打赏
  • 举报
回复
调用函数前必须声明函数或直接在前面定义函数。
东莞某某某 2010-06-13
  • 打赏
  • 举报
回复
没看清题呵呵,学习3L了。

呵呵 大家也不要带情绪了,讨论问题尽量不要在乎与问题无关的,技术有等级,人可不要分等级,互相尊重
冻结 2010-06-13
  • 打赏
  • 举报
回复
楼主该虚心向taodm学习!
arong1234 2010-06-13
  • 打赏
  • 举报
回复
所以需要你区分哪些警告重要,哪些不重要了。这个警告的文字一读,就觉得风险比较大,你竟然忽略[Quote=引用 14 楼 yueyucanyang 的回复:]
引用 13 楼 taodm 的回复:
至于你觉得“最后警告我会全部处理掉”,那就不是“传说中的典型的C程序员”,恐怕还不够。
因为很多警告必须被认为是错误,而需要立即处理,而不是机械地最后不可以留警告。


你的意思就是说只要编写代码出现警告就是“传说中的典型的C程序员”?我想任何程序员编写代码总是难免出现警告,但是警告也是需要一点点调试掉的。唉……。真是鱼龙混杂啊!~
[/Quote]
yueyucanyang 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 taodm 的回复:]
至于你觉得“最后警告我会全部处理掉”,那就不是“传说中的典型的C程序员”,恐怕还不够。
因为很多警告必须被认为是错误,而需要立即处理,而不是机械地最后不可以留警告。
[/Quote]

你的意思就是说只要编写代码出现警告就是“传说中的典型的C程序员”?我想任何程序员编写代码总是难免出现警告,但是警告也是需要一点点调试掉的。唉……。真是鱼龙混杂啊!~
taodm 2010-06-13
  • 打赏
  • 举报
回复
至于你觉得“最后警告我会全部处理掉”,那就不是“传说中的典型的C程序员”,恐怕还不够。
因为很多警告必须被认为是错误,而需要立即处理,而不是机械地最后不可以留警告。
taodm 2010-06-13
  • 打赏
  • 举报
回复
原因在3楼就已经答了。
yueyucanyang 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 taodm 的回复:]
楼主果然是传说中的典型的C程序员,只看error,无视warning的。
[/Quote]
我只想问一下为什么会出现这样的事情?希望不要跑题。
当然最后警告我会全部处理掉的。因为我这个函数的参数会不断的修改,暂时不打算声明,等完全确定之后再去声明。

我想你作为一个四星级的用户,最好了解了特定的环境后在对人进行评价。我只是针对这件事而已!
yueyucanyang 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kuyucman 的回复:]
,后来检查发现,在B函数之前未做A函数的声明,当声明之后,参数传递就正确了

似乎A未在B之前声明的话,编译不会通过。

C/C++ code
#include<stdio.h>

void B()
{
A(); //error C2065: 'A' : undeclared identifier
}


void A()
{
NULL;
}

……
[/Quote]
A和B不放在通过一个文件,你在试试,且建立一个头文件,A.H。B包含A.H,但是A.H中可以不做声明
taodm 2010-06-13
  • 打赏
  • 举报
回复
楼主果然是传说中的典型的C程序员,只看error,无视warning的。
yueyucanyang 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengpeng_xixi 的回复:]
在调用一个函数之前要先声明,除非是被调用的函数写在调用它的函数的前面,这样就不用声明
[/Quote]

我在使用VC6.0,编译没有问题,只是有警告而已!~
yueyucanyang 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kuyucman 的回复:]
,后来检查发现,在B函数之前未做A函数的声明,当声明之后,参数传递就正确了

似乎A未在B之前声明的话,编译不会通过。

C/C++ code
#include<stdio.h>

void B()
{
A(); //error C2065: 'A' : undeclared identifier
}


void A()
{
NULL;
}

……
[/Quote]

我的可以通过啊?只是有警告,warning C4013: 'EncInit' undefined; assuming extern returning int
llh318724 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jackyloncoln 的回复:]
前面已经说的很详细了。

在一个函数A()调用另一个函数B()时,必须在A之前对B函数进行声明。

或者将B函数放在A函数之前。
[/Quote]

同意
jackyloncoln 2010-06-13
  • 打赏
  • 举报
回复
前面已经说的很详细了。

在一个函数A()调用另一个函数B()时,必须在A之前对B函数进行声明。

或者将B函数放在A函数之前。
liutengfeigo 2010-06-13
  • 打赏
  • 举报
回复
确实是这样~
加载更多回复(3)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧