| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 596 人关注过本帖
标题:层层迷雾的外部函数调用问题!
只看楼主 加入收藏
jacoblion
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-8-20
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:10 
层层迷雾的外部函数调用问题!
tt.c
程序代码:
#include<stdio.h>
int m=22;
void abcc();
int main(void)
{
        abcc(m);
        return 0;
}
abcc.c
程序代码:
#include<stdio.h>
int m;
void abcc(void)
{
        printf("%d\n",m);
}

编译执行结果如下:
[root@localhost tmp]# gcc -Wall -o test abcc.c tt.c
[root@localhost tmp]# ./test
22

看似abcc(m)调用,m值传递成功了,gcc编译也不报错,还能打印出m的值。求解。
但很显然,abcc.c中定义的abcc函数是无参数传递的,abcc(m)就是个错误用法。正确用法是abcc()。
改成abcc()是可以,不过整个代码看起来还是很别扭。
搜索更多相关主题的帖子: 函数 
2011-08-20 05:04
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:2 
没main怎么运行出来的?不懂gcc!

   唯实惟新 至诚致志
2011-08-20 07:47
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:2 
m 是个全局变量,abcc 自然可以访问它了。

abcc 的原型是 void abcc(); 。不管你给他传递什么参数他都会忽略掉。
如果你想禁止向 abcc() 传递任何参数,就写 void abcc(void);
2011-08-20 10:34
jacoblion
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-8-20
收藏
得分:0 
回复 3楼 voidx
#include<stdio.h>
int m=22;
void abcc(int x);
int main(void)
{
        abcc(23);
        return 0;
}

tt.c改成这样,结果还是打印22
void abcc(int x);函数原型,abcc(23)是怎么调用的,括号中的内容也被忽略了?它是怎么调用的呢
main函数中abcc的申明与外部函数中的abcc申明不一致,它是怎么调用的啊?


2011-08-21 00:10
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:2 
你的abcc.c文件中用的m是文件级变量,函数中的printf语句当然可以访问到,而不论函数本身的要求不能带入任何参数。因此,你主函数中传入的参数23是无意义的,在调用的时候直接忽略。你可以用gdb单步调式,发现进入abcc函数后没有任何参数传递进去。有个疑问是,使用外部函数的时候,怎么没有加extern?

[ 本帖最后由 pauljames 于 2011-8-21 09:49 编辑 ]

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2011-08-21 09:47
饭桶
Rank: 6Rank: 6
等 级:侠之大者
帖 子:165
专家分:422
注 册:2011-4-5
收藏
得分:2 
你定义了一个全局变量并且这个全局变量还具有外连接,你可以这么定义试试 static int m
tt.c
程序代码:
#include<stdio.h>
static int m=22;
void abcc();//也许改成这样更规范void abcc(void);
int main(void)
{
        abcc(m);
        return 0;
}
abcc.c
程序代码:
#include<stdio.h>
 int m;
void abcc(void)
{
        printf("%d\n",m);
}
试一下!

[ 本帖最后由 饭桶 于 2011-8-22 00:05 编辑 ]

人得一生得奋斗!
2011-08-22 00:03
jacoblion
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-8-20
收藏
得分:0 
tt.c文件:
#include<stdio.h>
int m=22;          //申明定义全局变量m,分配储存空间
void abcc(void);
int main(void)
{
        abcc();
        return 0;
}

abcc.c文件:
#include<stdio.h>
int m;            //申明变量m,不分配储存空间
void abcc(void)
{
        printf("%d\n",m);
}

编译运行:
[root@localhost tmp]# gcc -Wall -o test abcc.c tt.c
[root@localhost tmp]# ./test
22


2011-08-22 10:24
jacoblion
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-8-20
收藏
得分:0 
回复 6楼 饭桶
多谢你的回答,代码里变量m我都是隐式申明的auto类型的,是想弄清这段代码到底是怎么分本储存空间,怎么执行的。
代码是我随便编出来测试的,所以代码写得很别扭,很少有这么用的。
2011-08-22 10:30
jacoblion
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2011-8-20
收藏
得分:0 
回复 5楼 pauljames
多谢你的回答,你说在main函数中申明abcc(),要用extern void abcc(void)吗?这个是规范用法,但不加extern申明,gcc也不会报错,我也没搞明白。
在bacc函数中定义时可以不用加extern的,因为extern是默认的,不用加也可以,所有的函数默认都可以被其它函数引用的。
2011-08-22 10:44
lin471306489
Rank: 4
等 级:业余侠客
帖 子:136
专家分:247
注 册:2011-8-16
收藏
得分:2 
还是不懂
!无参数函数,就是主函数不向被调用函数传递数据,
可是abccc(m),却能通过编译!
大家都说m是全局变量,因此能通过编译。
2011-08-22 10:54
快速回复:层层迷雾的外部函数调用问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022742 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved