第一字

这些标识符都带有特别之义所以称为关键字

extern关键字,c#extern关键字

中心解释:extern可以放变量或者函数前,以标示变量或者函数的定义在别的文件被,提示编译器遇到这个变量和函数时在外模块中搜索那定义。此外extern也可用来进行链接指定。

      也就是说extern有点儿只意,第一独,当其与”C”一起连用时,如: extern
“C” void fun(int a, int
b);则告诉编译器在编译fun这个函数名时按着C的平整去翻译相应的函数名如不是C++的,C++的规则以翻译是函数名时会把fun这个名字变得面目全非,可能是[email protected]_int_int#%$也说不定是别的,这如拘留编译器的”脾气”了(不同之编译器采用的方不平等),为什么如此做也,因也C++支持函数的重载咦,在此地不去过多之阐发是题材,如果你发出趣味可以去网上找,相信您可博得满意的说!
    第二,当extern不跟”C”在一道修饰变量或函数时,如以峰文件中: extern
int
g_Int; 它的意图就是是声称函数或全局变量的图范围之机要字,其声明的函数和变量可以以本模块活其他模块中使用,记住它们是一个宣称非是概念!也即是说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它一旦包含A模块的头文件即可,在编译阶段,模块B虽然搜索不顶拖欠函数或变量,但其不见面报错,它会以连续时打模块A生成的目标代码中找到这个函数。

2 问题:extern 变量
  以一个起源文件里定义了一个数组:char a[6];
  于另外一个文本里用下列语句进行了声明:extern char *a;
  请问,这样好啊? 
  答案和析:
  1)、不得以,程序运行时会见告知你私自访问。原因在于,指向类型T的指针并无抵于类型T的数组。extern
char
*a声明的凡一个指针变量而非是字符数组,因此与事实上的定义不同,从而造成运行时暗访问。应该用宣示改吧extern
char a[ ]

  2)、例子分析如下,如果a[] = “abcd”,则外部变量a=0x61626364
(abcd的ASCII码值),*a显然并未意义
  显然a指向的空中(0x61626364)没有意义,易起非法内存访问。
  3)、这提醒我们,在使用extern时候要严加对应声明时的格式,在实质上编程中,这样的错屡见不鲜。
  4)、extern用当变量声明中时常发生这般一个企图,你在*.c文件被宣称了一个大局的变量,这个大局的变量如果要被引用,就置身*.h中并用extern来声明。

3 问题:当方面修改extern 函数原型
  当函数提供方单方面修改函数原型时,如果采用方不知情继续套用原来的extern申明,这样编译时编译器不会见报错。但是以运作过程遭到,因为少了或者多矣输入参数,往往会照成系统错误,这种状况应什么缓解?
  答案和析:
  时业界对这种场面的处理没有一个老大圆满的方案,通常的做法是提供方在好的xxx_pub.h中提供针对性表接口的扬言,然后调用方include该头文件,从而省去extern这无异于步。以避免这种错误。
  宝剑有双锋,对extern的使用,不同的场子当选择不同之做法。

4 问题:extern “C”
  以C++环境下用C函数的当儿,常常会冒出编译器无法找到obj模块中之C函数定义,从而造成链接失败的景况,应该怎么解决这种场面吧?

  答案和分析:
  C++语言在编译的时刻以缓解函数的多态问题,会将函数叫和参数联合起来别一个中等的函数名称,而C语言则非见面,因此会面招致链接时寻找不顶对应函数的情,此时C函数就得用extern
“C”进行链接指定,这告诉编译器,请保持自己的称呼,不要受自家别用于链接的中等函数名叫。
  下面是一个正经的写法:
//在.h文件的峰上
#ifdef __cplusplus
#if __cplusplus
extern “C”{
 #endif
 #endif /* __cplusplus */ 
 …
 …
 //.h文件了之地方
 #ifdef __cplusplus
 #if __cplusplus
}
#endif
#endif /* __cplusplus */ 

5 问题:extern 函数声称
  常常见extern放在函数的前面成为函数声明的同局部,那么,C语言的最主要字extern在函数的宣示中打什么打算?
  答案和分析:
  如果函数的扬言中蕴藏关键字extern,仅仅是暗示这函数可能当别的源文件里定义,没有另外企图。即下述两单函数声明没有明了的界别:
extern int f(); 和int f();
  当然,这样的用处还是片,就是以次中代表include
“*.h”来声称函数,在有苛的类型遭到,我比习惯在具有的函数声明前上加extern修饰。关于这样做的原由及利弊可见下面的斯例子:“用extern修饰的全局变量”

    (1) 在test1.h中出下列声明:
    #ifndef TEST1H
    #define TEST1H
    extern char g_str[]; // 声明全局变量g_str
    void fun1();
    #endif
    (2) 在test1.cpp中
    #include “test1.h”
        char g_str[] = “123456”; // 定义全局变量g_str
        void fun1() { cout << g_str << endl; }
    (3) 以上是test1模块,
它的编译和连续都好经过,如果我们还有test2模块也想使用g_str,只待以原来文件中援引就可以了
    #include “test1.h”

     void fun2()    { cout << g_str << endl;    }
   
以上test1和test2可以同时编译连接通过,如果你感兴趣的语句可以就此ultraEdit打开test1.obj,你得以里边找到”123456″这个字符串,但是你可无能够于test2.obj里面找到,这是坐g_str是举工程的全局变量,在内存中单在一样卖,test2.obj这个编译单元不欲还闹同样客了,不然会在连时告诉又定义之似是而非!
    (4)
有些人欢喜拿全局变量的扬言和定义在同,这样可防范遗忘了概念,如将方test1.h转移吧
    extern char g_str[] = “123456”; // 这个时段一定给无extern
   
然后把test1.cpp中的g_str的概念去丢,这个时刻更编译连接test1和test2两个模块时,会报连接错误,这是为您把全局变量g_str的定义在了头文件后,test1.cpp这模块包含了test1.h所以定义了平次于g_str,而test2.cpp也蕴藏了test1.h所以再同差定义了g_str,这个时候连接器在一连test1和test2时意识个别只g_str。如果你无要是把g_str的概念在test1.h中的话,那么尽管把test2的代码中#include
“test1.h”去掉 换成:
    extern char g_str[];
    void fun2()   {  cout << g_str << endl;   }
   这个时段编译器就知道g_str是引自于表面的一个编译模块了,不会见于本模块被重复重复定义一个出去,但是自思说这么做特别糟糕,因为你由于无法以test2.cpp中以#include
“test1.h”,那么test1.h中声称的其它函数你也束手无策采取了,除非也用都用extern修饰,这样的话你不过声明的函数就假设一如既往颇失误,而且头文件之意图就是如果让外部提供接口使用的,所以
请记住, 仅仅在头文件被召开声明(不定义),真理总是如此简单

6. extern 和 static

 (1) extern 表明该变量在别的地方已经定义了了,在此而运好变量.
 (2) static 代表静态的变量,分配内存的时, 存储在静态区,不存储于栈上面.

    static 作用范围是其中连接的干,
和extern有点相反.它和对象自我是分离储存的,extern也是分开储存的,但是extern可以吃外的目标用extern
引用,而static 不可以,只允许对象自我用它.
具体差异首先,static与extern是相同对“水火不容”的枪杆子,也就是说extern和static不可知以修饰一个变量;其次,static修饰的全局变量声明和概念同时开展,也就是说当您当头文件被运用static声明了全局变量后,它吗还要为定义了;最后,static修饰全局变量的作用域只能是自我的编译单元,也就是说它的“全局”只针对本编译单元中,其他编译单元则看不到它们,如:
    (1) test1.h:
    #ifndef TEST1H
    #define TEST1H
    static char g_str[] = “123456”; 
    void fun1();
    #endif

    (2) test1.cpp:
    #include “test1.h”
    void fun1()  {   cout << g_str << endl;  }
    (3) test2.cpp
    #include “test1.h”
    void fun2()  {   cout << g_str << endl;  }
    以上两独编译单元可以连续成功,
当你打开test1.obj时,你得在它其中找到字符串”123456″,同时您也可当test2.obj中找到她,它们之所以得以连续不断成而没报再定义的左是以尽管她发出同样之情节,但是存储的物理地址并无一致,就像是零星单不同变量赋了相同之价一样,而及时有限只变量分别作用被其分别的编译单元。
也许你比比真,自己暗中的跟踪调试上面的代码,结果而意识少独编译单元(test1,test2)的g_str的内存地址相同,于是你生定论static修饰的变量也足以作用被外模块,但是自只要告知您,那是你的编译器在欺诈你,大多数编译器都对准代码都来优化作用,以达生成的目标程序更省去内存,执行效率又强,当编译器在连接各个编译单元的上,它见面管同内容的内存只拷贝一卖,比如上面的”123456″,
位于少数单编译单元中之变量都是平的情,那么以连接的时刻她以内存中虽单纯会满怀于相同份了,如果您将地方的代码改成为下面的榜样,你立即就得拆过编译器的谎言:
    (1) test1.cpp:
    #include “test1.h”
    void fun1()
    {
        g_str[0] = ”a”;
        cout << g_str << endl;
    }

    (2) test2.cpp
    #include “test1.h”
    void fun2()  {  cout << g_str << endl;  }
    (3) void main()     {
        fun1(); // a23456
        fun2(); // 123456
    }
   
这个时你于跟踪代码时,就会见发现有限个编译单元中之g_str地址并不相同,因为您在同等地处修改了她,所以编译器被强行的回复内存的天赋,在内存中在了区区份拷贝给点儿单模块中的变量使用。正是因static有上述之特点,所以一般定义static全局变量时,都管它们置身原文件中设休是头文件,这样尽管非会见于其它模块造成不必要的消息污染,同样记住是标准吧!

7. extern 和const

  
C++中const修饰的全局常量据有与static相同之风味,即其只能作用为按照编译模块中,但是const可以同extern连用来声称该常量可以作用被外编译模块中,
如extern const char g_str[];
    然后在本来文件被变化忘了概念:     const char g_str[] = “123456”; 

   
所以当const单独使用时它就和static相同,而当与extern一起搭档之时刻,它的特点就是跟extern的平等了!所以对const我莫呀可以过多的叙述,我只是怀念唤醒您,const
char* g_str = “123456” 与 const char g_str[] =”123465″是差之,
前面老const 修饰的凡char
*而不是g_str,它的g_str并无是常量,它给当做是一个概念了的全局变量(可以为外编译单元使用),
所以如果你比如说受char*g_str遵守const的全局常量的规则,最好这么定义const
char* const g_str=”123456″.

 

转载自:http://www.cnblogs.com/yc\_sunniwell/archive/2010/07/14/1777431.html

http://www.bkjia.com/cjjc/1048845.htmlwww.bkjia.comtruehttp://www.bkjia.com/cjjc/1048845.htmlTechArticleextern关键字,c\#extern关键字 1 基本解释 :
extern可以放置变量或者函数前,以标示变量或者函数的概念在别的文件中,提示编译器遇到这个变量…

下面这链接把拥有的重大字还列举出了

类名,包名,变量名,方法名(函数),参数和常量名

在JAVA语言中有部分出于jdk定义好之片标识符

俺们在描写程序时无能够以主要字来定名

https://baike.sogou.com/m/fullLemma?lid=53323961&fromTitle=java%E5%85%B3%E9%94%AE%E5%AD%97

由于主要字于多这里不好列举(….懒得写)

还要简要的说明了一一显要字的用法

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图