以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 编程心得 』   (http://bbs.xml.org.cn/list.asp?boardid=42)
----  函数调用需要放在什么地方  (http://bbs.xml.org.cn/dispbbs.asp?boardid=42&rootid=&id=61015)


--  作者:piaowuxk
--  发布时间:4/7/2008 8:37:00 PM

--  函数调用需要放在什么地方
#include<stdio.h>
void max(int a)
{printf("%d",a);}
max(4);
void main()
{}

我先定义一个函数max,然后调用这个函数,编译时报错
error C2501: 'max' : missing storage-class or type specifiers
error C2373: 'max' : redefinition; different type modifiers

感觉程序是把max(4)看成声明去了。
如果这样写,
#include<stdio.h>
void max(int a)
{printf("%d",a);}

void main()
{max(4);}  就没有错,希望大家解释一下,是不是函数的调用都要放在另外一个函数里面啊?


--  作者:netjian
--  发布时间:4/10/2008 11:24:00 AM

--  
是的。
但你在

#include<stdio.h>
void max(int a)
{printf("%d",a);}
max(4);
void main()
{}

中写的max(4),既谈不上是调用,也谈不上是声明。
因为:
1.调用

调用不一定必须在函数内调用,但是,这个调用一定要与主函数main()有一定的关系:
假设一个函数F1,此函数要么在main()中被调用;要么在另一个函数F2中被调用,然后F2在main()中被调用的时候再执行F1。


2.声明

在同一个代码文件中,声明必须进行在函数被定义之前,而在你的代码中,先对函数进行了定义,然后再进行了声明,这个不能再叫声明了。在此编译器认为你想对此函数进行一次重载,而且缺乏一个函数返回类型。


--  作者:piaowuxk
--  发布时间:4/10/2008 5:16:00 PM

--  
thanks,有些明白了。
以下是引用netjian在2008-4-10 11:24:00的发言:

1.调用

调用不一定必须在函数内调用,但是,这个调用一定要与主函数main()有一定的关系:


我觉得调用也不一定和主函数main()有一定的关系。如
#include<stdio.h>
int max(int a)
{return a;}
int b=max(4);
void main()
{printf("%d",b);}

感觉这个调用也没放到另外一个函数内调用,和main()也没什么关系


--  作者:netjian
--  发布时间:4/11/2008 6:51:00 PM

--  
以下是引用piaowuxk在2008-4-10 17:16:00的发言:
thanks,有些明白了。
[quote]以下是引用netjian在2008-4-10 11:24:00的发言:

  1.调用

  调用不一定必须在函数内调用,但是,这个调用一定要与主函数main()有一定的关系:
  
[/quote]

我觉得调用也不一定和主函数main()有一定的关系。如
#include<stdio.h>
int max(int a)
{return a;}
int b=max(4);
void main()
{printf("%d",b);}

感觉这个调用也没放到另外一个函数内调用,和main()也没什么关系


其实你上面的调用是与main函数有关系的。
当执行printf("%d",b)的时候,首先,它要知道b是什么,然后就到了b = max(4),然后就执行了函数max(4),返回一个4,然后再将4赋给b,最后打印出4。

你调试一下就看到清楚的过程了。


--  作者:zhenghaona
--  发布时间:4/23/2008 9:22:00 AM

--  
谢谢楼主
--  作者:yangzhj05
--  发布时间:4/24/2008 6:02:00 PM

--  
#include<stdio.h>
int max(int a)
{return a;}
int b=max(4);
void main()
{printf("%d",b);}

你这一段代码可以编译通过么?我感觉貌似不可以

b是全局变量,初始化的时候后面的值是确定的,默认int为0.而你的是一个函数,函数的值返回值不确定。

用户态程序中的函数调用应该是和main函数有关,直接或间接调用,因为用户态程序初始化工作首先会初始化全局区,而全局区初始化的时候会分配内存,这些都是确定的,如果在全局去调用函数,就不知道分配空间大小,这应该是编译器不允许的。当然,如果在linux内核内编写程序就不一定了,因为在进入main函数前还有很多工作,比如初始化硬件的某些函数,这个时候和main函数没有关系


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms