免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: nbfan
打印 上一主题 下一主题

[C] 请教各位,C语言什么情况下函数需要预先申明才可使用。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-01-06 17:26 |只看该作者

请教各位,C语言什么情况下函数需要预先申明才可使用。

精简一下,看下面
头文件是个"stack.h"这个没问题,是个自己写的double行的栈;
stack里面的函数
void InitStack(Stack *,int);初始化
void push(Stack *,Type);压战
Type pop(Stack *,Type);弹出
void ClearStack(Stack *);清空
void DestroyStack(Stack *);销毁
int StackEmpty(Stack); 判断是否空
Type GetTop(Stack);栈顶元素


/* changeRMB.h 头文件人民币转换程序*/
里面的函数
int Yxsz(char *arr)/*判断输入是否为有效的数字*/
void Yxws(char **arr)   /*判断输入的有效位数小数点前后去零,只保留有效部分*/
void Fenjie(char **hd,char **rd,char *num) /*分解小数点前与小数点后*/
void Head(char *head,char **headok[])/*处理整数部分*/
void Point(char *rear,char **rearok[]) /*/处理小数部分*/
void Value(char *num)/*/最终结果*/

/*主程序calculator.c*/
函数如下
int GetTwoOperand(Stack *s,Type *num1,Type *num2) /*从栈中取得两个操作数*/

void Compute(Stack *s,char ch) /*用去的的两个操作书进行计算结果再压入栈中*/

void Run(Stack *s,char *num) /*判断字符,把操作数压入栈,遇到操作符进行运算,斌且输出结果*/

void Zhuan(int num,int jz) /*10进制数到任意进制的转换*/

int Menu(void) /*简单菜单*/

void transform(char *ps, char *pe)    /*转化为后缀表达式*/
int IN(char ch)                       /*判断是否是字符*/
int precede(char c, char ch)           /*判断字符优先级*/
void enter(char exp[]) /*输入处理*/

说明一下,头文件里的函数,和main里的函数全部没有申明,都是直接定义使用。
但是就下面3个函数必须提前申明,否则编译出现警告信息。

void transform(char *ps, char *pe)    /*转化为后缀表达式*/
int IN(char ch)                       /*判断是否是字符*/
int precede(char c, char ch)           /*判断字符优先级*/

就上面这3个,所以我问这个问题的意思就是,如果严格来说应该是先申明,定义,使用;
但是我不理解的是别的函数没有申明可以使用,为什么这3个函数就必须要申明,否则出现警告信息。

我的表达能力实在差,上面就是我的问题。

论坛徽章:
0
12 [报告]
发表于 2005-01-06 17:30 |只看该作者

请教各位,C语言什么情况下函数需要预先申明才可使用。

原帖由 "assiss" 发表:
唉。怎么说你好呢。
如果不先声明,你的程序就是这样:
oid transform(char *ps, char *pe)
{
……
IN();
......
precede();
}

int IN(char ch)   
{
……
}
int precede(char c, char ch)  
{..........


感谢你能看我的程序,但是我的main函数里不光这3个函数,下面这5个函数同样在main里定义使用,并没有申明,为什么就没有警告提示?
int GetTwoOperand(Stack *s,Type *num1,Type *num2)
void Compute(Stack *s,char ch)
void Run(Stack *s,char *num)
void Zhuan(int num,int jz)
int Menu(void)

论坛徽章:
0
13 [报告]
发表于 2005-01-06 17:41 |只看该作者

请教各位,C语言什么情况下函数需要预先申明才可使用。

原帖由 "cellar" 发表:


really???你确定你知道?
函数声明、函数定义、函数声明并同时定义,你确定你知道??
函数使用之前必须被“可见的”声明。


我知道,否则我就不会把这3个函数单独写个申明。
正因为我已开始写别的函数的时专门做了测试,确实不需要申明。
所以我才省略了所有函数的申明。

现在问题是一个文件里定义的函数,5个不需要申明,3个必须申明否则提示警告信息,我这里不明白。

论坛徽章:
0
14 [报告]
发表于 2005-01-06 18:02 |只看该作者

请教各位,C语言什么情况下函数需要预先申明才可使用。

呵,不和你治气了,其实你不知道

其它函数其实是在定义的时候隐式的声明了,因为其它的三个函数是在别的文件中定义(声明)的,所以要么你在自己的c文件中包含定义它们的头文件,要么就要自己定义一下它们,你可以看一下effective c++中关于声明和定义的一节,还有如何用声明来减弱各文件间的依赖关系一节.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
15 [报告]
发表于 2005-01-06 18:08 |只看该作者

请教各位,C语言什么情况下函数需要预先申明才可使用。

你的警告说明函数IN和precede采用了隐含的声明,即认为这两个函数是int型的,原因是在声明前引用了这两个函数,见assiss的回贴
transform的引用(在main函数中)在定义的后面,应该没有关系。你试一下只声明IN和precede,看会不会出错。

论坛徽章:
0
16 [报告]
发表于 2005-01-06 18:11 |只看该作者

请教各位,C语言什么情况下函数需要预先申明才可使用。

原帖由 "cellar" 发表:
呵,不和你治气了,其实你不知道

其它函数其实是在定义的时候隐式的声明了,因为其它的三个函数是在别的文件中定义(声明)的,所以要么你在自己的c文件中包含定义它们的头文件,要么就要自己定义一下它们,你可?.........


谢谢你的回答。
请仔细看我上面的说明,我所有的函数,包括两个头文件里的函数,都没有"申明",而现在的问题是。在calculator.c里面的9个函数(不包括main),只有3个需要申明,而不申明就会出些警告信息。而且那6个没有申明的函数,在别的文件里也没有申明。


int GetTwoOperand(Stack *s,Type *num1,Type *num2) /*从栈中取得两个操作数*/

void Compute(Stack *s,char ch) /*用去的的两个操作书进行计算结果再压入栈中*/

void Run(Stack *s,char *num) /*判断字符,把操作数压入栈,遇到操作符进行运算,斌且输出结果*/

void Zhuan(int num,int jz) /*10进制数到任意进制的转换*/

int Menu(void) /*简单菜单*/

void transform(char *ps, char *pe) /*转化为后缀表达式*/
int IN(char ch) /*判断是否是字符*/
int precede(char c, char ch) /*判断字符优先级*/
void enter(char exp[]) /*输入处理*/
int main();

/*************************************/
现在的主要问题是。统一个文件里的9个自定义函数,只有下面3个必须申明,这是个什么道理?

void transform(char *ps, char *pe) /*转化为后缀表达式*/
int IN(char ch) /*判断是否是字符*/
int precede(char c, char ch) /*判断字符优先级*/

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
17 [报告]
发表于 2005-01-06 18:18 |只看该作者

请教各位,C语言什么情况下函数需要预先申明才可使用。

因为:
1、可能是其余的函数都在main前面定义了。这样定义就相当于原型和声明了。
2、其余的函数都是int返回值,或者参数是int。被编译器默认了。

论坛徽章:
0
18 [报告]
发表于 2005-01-06 18:20 |只看该作者

请教各位,C语言什么情况下函数需要预先申明才可使用。

刚才又看了一下,终于搞明白了。
把这3个函数顺序改变一下就可以了。而且不用申明。
void transform(char *ps, char *pe)
int IN(char ch)
int precede(char c, char ch)
/****************************/
改成
int IN(char ch)
int precede(char c, char ch)
void transform(char *ps, char *pe)

这样就没有警告信息了。原因在于,transform里面需要调用 IN()和precede().

真晕了,感谢“精灵王”给我的灵感。

问题终于解决,感谢大家容忍我的纠缠!

函数之间如果有互相调用,那么最好定义前申明,我的总结!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
19 [报告]
发表于 2005-01-06 18:23 |只看该作者

请教各位,C语言什么情况下函数需要预先申明才可使用。

晕死。
不过总算明白了。自己总结出来也好。

其实,这些东西教材上明白写着呢。为啥不仔细看呢?在这费了这么多口水。

论坛徽章:
0
20 [报告]
发表于 2005-01-06 18:25 |只看该作者

请教各位,C语言什么情况下函数需要预先申明才可使用。

原帖由 "aero" 发表:
晕死。
不过总算明白了。自己总结出来也好。

其实,这些东西教材上明白写着呢。为啥不仔细看呢?在这费了这么多口水。


这个程序是我和网友和写的,而这三个问题函数,是他写的,我粘贴到我的代码里,没有仔细看里面的函数调用。这正是问题所在!


我提问题之前都会很仔细的研究学习资料的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP