| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 650 人关注过本帖
标题:求 extern 的应用
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
不是。extern是用来声明用的,不是定义用的。要理解声明和定义的不同。全局变量的作用域一直都是整个程序域,但直接引用只能在同一文件中,跨文件的引用就需要extern这个关键字。它是一个声明,声明并不创建变量,创建变量的行为叫定义。从另一个角度来说,extern可以保证你的程序中对这个变量的引用是唯一的。

怎么样?是不是还是一头雾水?这些概念需要有实际操作的经历才能体会清晰。

重剑无锋,大巧不工
2013-02-26 21:09
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
你没有进行参数的传递.....还有单独的局部变量怎么会main()中其作用呢!.....就算是全局变量再局部变量里也是不起作用的

仰望星空...........不忘初心!
2013-02-26 21:10
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 10楼 模糊
因为你main中定义的i是个局部变量,它临时创建于堆中,编译器不可能在编译时确定它的地址。

重剑无锋,大巧不工
2013-02-26 21:11
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
是的...是声明....谢了...

仰望星空...........不忘初心!
2013-02-26 21:11
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:1 
程序代码:
#include<stdio.h>

int i=0;
void dec2yyy(int yyy,int source,char* bin)
{
    if(source==0) return;
    dec2yyy(yyy,source/yyy,bin);
    if((source%yyy)<10) bin[i]=(char)(source%yyy+0x30);
    else bin[i]=(char)(source%yyy+0x37);
    i++;
}

int main(void)
{
    char dest[10]={'\0'};
    for(int j=1;j<256;j++)
    {
        if((j&68)==68)
        {
            dec2yyy(2,j,&dest[0]);
            i=0;
            printf("(10) is %4d (2) is %s\n",j,&dest[0]);
        }
    }
    printf("\n");
    return 0;
}
单单是使用全局变量 也没那么麻烦
这是我前2天写的一个小玩意,可参考 也可无视

DO IT YOURSELF !
2013-02-26 21:12
模糊
Rank: 2
等 级:论坛游民
帖 子:56
专家分:53
注 册:2013-2-26
收藏
得分:0 
回复 13楼 beyondyf
那怎么才可以体现出 extern 的扩展作用呢?
2013-02-26 21:45
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
这个你问问bey版吧....我还没实际操作过...只是平时看过

仰望星空...........不忘初心!
2013-02-26 21:47
信箱有效
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1102
专家分:4268
注 册:2012-6-19
收藏
得分:1 
百度百科里讲的还不够详细吗
2013-02-26 22:10
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
收藏
得分:1 
#include<stdio.h>
int main(void)
{
    extern int a;
    printf("%d",a);
    return 0;
}
extern int a=10;
2013-02-27 10:57
zhangqi_gsts
Rank: 6Rank: 6
来 自:甘肃天水
等 级:侠之大者
威 望:1
帖 子:227
专家分:457
注 册:2011-3-27
收藏
得分:1 
在多文件编写中,变量,尤其的全局变量的定义和引用显得不那么精简。很多人可能会想,把全局变量放在一个*.h文件中,然后在以后的调用中只要include一下不就可以了?想想也有道理,include不就是把*.h原封不动的复制过来吗?但是,这样存在一个问题。加入定义了10个全局变量,而在具体一个*.c文件中我只用其中一个。如果用include把全局变量全都包含进来。那利用率不就才是10%吗。而且C语言常用于嵌入式,如果每个文件都include一个全局变量头文件,那么这些变量就被分配一次内存,这对嵌入式来说肯定是致命的;另外,如果有很多个文件都include了全局变量的头文件,编译器要跟踪每一个文件对其中一个变量的更改,这对编译器来说也是吃不消的。
      所以便有了*.c和*.h的区别。
      很多人都知道声明和定义的区别——一个分配内存,一个不分配内存,而且函数的声明和定义更是显而易见,但是对于变量的声明和定义,就显得有些模糊不清。由于如上所述的种种原因,C语言中全局变量放在*.c文件,而不放在*.h文件。这样一来,*.h文件好像无用武之地了,非也。我们经常见到#include "****.h",但有谁见过#include "***.c"吗?所以*.h文件用来声明,*.c文件用来实现,在调用处用extern声明。
        1、普通变量定义成全局变量
        如果是普通类型,完全可以不用*.h文件,直接在*.c文件中定义,在调用文件处用extern 声明,因为对于普通类型,编译器是可以识别的。比如在一个 my.c文件中,我定义了char name[10];那么在别的文件中只要用extern char name[](由于是声明,一位数组可以省略大小,但不建议用指针,比较指针和数组是两回事)外部声明就可以了,告诉编译器这个变量我已经定义过了,具体怎样,你慢慢找吧。这符合常理,因为char是编译器能自主识别的类型。
        2、自定义结构体类型定义成全局变量
        不同于普通类型,如果不预先通知编译器,编译器是不会识别你自定义的类型的。这个时候,*.h文件便出现了。不是定义结构类型不占内存吗?那好,我大结构体的定义放在*.h文件中,这样一来,无论你incude无数次,内存都不会被占用的。而且这样还有个好处,在别的文件中可以include这个*.h文件,这样,在这个文件中,编译器就可以识别你的自定义类型了,目的不就达到了?  假如我在global.h中定义了
typedef struct _POSITION
{
        int x;
        int y;
}POSITION;
那么我可以在一个global.c文件中实现全局变量的定义,不过要include那个*.h文件,比如
/* ***global.c ******* */
include “global.h”
POSITION current,;  
这样就定义了cunrrent这个变量,在别的文件中引用这个变量时,只要extern POSITION current;进行声明,然后就可以用了,不过这个文件也还得include "global.h" 因为如果不包含,在这个文件中是不识别POSITION类型的。



http://user.qzone.
2013-02-27 11:42
快速回复:求 extern 的应用
数据加载中...
 
   



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

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