| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1873 人关注过本帖
标题:关于extern的用法 编译错误 求指教
只看楼主 加入收藏
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
结帖率:95.37%
收藏
已结贴  问题点数:20 回复次数:13 
关于extern的用法 编译错误 求指教
#include<stdio.h>
int main()
{
    void fun(int a[3]);
    int *p,b[3];
    p=b;
    fun(b);
    extern int i;// 这一步怎么不对??
    for(;i<3;i++,p++)
        printf("%d",*p);
    return 0;
}
void fun(int a[3])
{
    int i=0;
    for(;i<3;i++)
      a[i]=i;
}
2017-03-29 17:02
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:5 
extern 只能用于具有静态存储类型的数据。

你在函数中声明的int i 是动态存储类型。

你把extern int i 丢到最外面就对了。当然依旧可能报错,要求你去掉extern。

extern在定义一个变量的时候可以省略。只有引用的时候才需要加上。

当然,extern还用于修饰一个函数,用来显式的声明这个函数可以跨文件使用。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-29 17:04
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 2楼 renkejun1942
#include<stdio.h>
int main()
{
    void fun(int a[3]);
    int *p,b[3];
    fun(b);
    extern int i;  
    for(p=b;i<3;i++,p++)
        printf("%d\n",*p);
    return 0;
}
int i=0;
void fun(int a[3])
{
   
    for(;i<3;i++)
      a[i]=i;
}

   改过之后编译的没问题 但是输不出来。。。。
图片附件: 游客没有浏览图片的权限,请 登录注册





2017-03-29 20:46
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
我回答的只是extern这个关键字的问题,你问的也是这个关键字,至于其他,我没兴趣。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-29 21:17
花脸
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:9
帖 子:788
专家分:907
注 册:2017-1-4
收藏
得分:0 
回复 4楼 renkejun1942
2017-03-29 22:38
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 5楼 花脸
昨天晚上心情不太好。
现在重新看了下你贴在三楼的代码,你只所以失败,是因为int i 对main()是不可见的。
因为int i的定义在main()的下面。
你把int i的定义 放在main()的上面就可以了。

一个变量的作用域,是从它定义的位置一直到结束位置。
对于一个自动变量而言,结束位置是一个代码块的结束,而对一个全局变量而言,是文件尾。


以下为例,当然只是用来作为说明,并不推荐你使用,否则会引起混乱。
在某个函数中:

int i;
i = 1;
for(int i = 0; i < 10; i++ )//防止某些人认为我写错了,说明一下,在for、while中定义变量,是C99标准。
    ;
printf("%d",i);


这里定义了两个变量i, 但是第二个i的作用域只在for循环中,for循环结束之后,第二个i就不见了,因此printf打印出来的值会是1;

[此贴子已经被作者于2017-3-30 05:47编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-30 05:42
huangshien
Rank: 1
等 级:新手上路
帖 子:2
专家分:5
注 册:2017-3-30
收藏
得分:5 
回复 3楼 花脸
你还得看下C语言基础,比如存储的方式有什么?1,全局变量 2,局部变量 3,静态全局变量 4,静态局部变量,这些变量的存储方式是什么样的,初始化是怎样的。问题来了,你的定义 int i = 0,在这里是全局变量,在这个编译文件每个函数都可以访问,但是这个i只初始化一次0,你在fun()函数已经对i操作,所以i的值已经发生了变化,你在打印的时候对i做了(i < 3)的判断,你觉得这个循环满足吗?
2017-03-30 09:28
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:5 
回复 6楼 renkejun1942
可以不让心情左右你吗  

答曰狠狠难

DO IT YOURSELF !
2017-03-30 14:07
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 8楼 wp231957
不被情绪干扰,这是不是太难了。

不过话说“答曰狠狠难”,是什么意思啊?

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-30 14:23
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用wp231957在2017-3-30 14:07:26的发言:

可以不让心情左右你吗  

答曰狠狠难



提问:可以不让心情左右你吗  
答(曰): 很难(狠狠难)

DO IT YOURSELF !
2017-03-30 14:25
快速回复:关于extern的用法 编译错误 求指教
数据加载中...
 
   



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

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