菜单

extern关键字,c#extern关键字

2018年11月16日 - Java

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

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; 它的用意就是是声称函数或全局变量的作用范围manbetx网页手机登录版之要字,其宣称的函数和变量可以于本模块活其他模块中使,记住它们是一个声明非是概念!也便是说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可以放置变量或者函数前,以标示变量或者函数的概念在别的文件被,提示编译器遇到是变量…

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

咱俩当写程序时莫能够利用主要字来命名

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

是因为关键字于多这里不好列举(….懒得勾)

下面这链接把所有的重中之重字都列举出了

并且简要的求证了一一显要字的用法

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

相关文章

发表评论

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

网站地图xml地图