范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

C八类标识符作用域(IdentifierScope)

  标识符(identifier)是程序中变量、类型、函数和标号的名称,它可以由程序设计者命名,也可以由系统指定。标识符由字母、数字和下划线组成,第一个字符不能是数字。
  通常来说,一段程序代码中所用到的标识符(名字)并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域(scope)。
  作用域的使用能够提高程序逻辑的局部性,增强程序的可靠性,减少名字冲突。
  对于C++来说,符号{}可以界定标识符的scope,关键字extern、static也可以拓宽或限制标识符的作用域。同时,类名、命名空间也可以限制标识符的作用域。1 global scope(全局作用域)
  典型的具有全局作用域的名字,包括:全局变量、全局函数等。
  Use of global variables is generally discouraged. It makes your program more difficult to understand, and harder to debug. But sometimes using a global variable is acceptable.
  通常不鼓励使用全局变量。它使您的程序更难理解,也更难调试。但有时使用全局变量是可以接受的。// global.h #ifndef GLOBAL_DOT_H /* This is an "include guard" */ #define GLOBAL_DOT_H /** * This tells the compiler that g_myglobal exists somewhere. * Without "extern", this would create a new variable named * g_myglobal in _every file_ that included it. Don"t miss this! */ extern int g_myglobal; /* _Declare_ g_myglobal, that is promise it will be _defined_ by * some module. */ typedef enum {      RESOURCE_UNDEFINED = -1,     RESOURCE_UNKNOWN = 0,      RESOURCE_OK,     RESOURCE_CANCEL,     RESOURCE_ABORT,     /* Insert more here. */     RESOURCE_MAX /* The maximum number of resources defined. */ } EnumResourceID; extern const char * const resources[RESOURCE_MAX];  extern const int gcvar = 12;  #endif /* GLOBAL_DOT_H */  // global.c #include "global.h" /* Always include the header file that declares something * in the C file that defines it. This makes sure that the * declaration and definition are always in-sync. */ int g_myglobal; /* _Define_ my_global. As living in global scope it gets initialised to 0 * on program start-up. */ // 全局变量(外部变量),在加载阶段加载 const char * const resources[RESOURCE_MAX] = {     "",     "OK",     "Cancel",     "Abort" };  // main.c #include "global.h" void test(){}   // 全局函数 int main(void) {     g_myglobal = 42;     EnumResourceID resource_id = RESOURCE_UNDEFINED;     while((++resource_id) < RESOURCE_MAX)     {         GoalKicker.com – C Notes for Professionals 252         printf("resource ID: %d, resource: "%s" ", resource_id, resources[resource_id]);     }          return 0; }2 Function Prototype Scope(函数原型作用域)
  函数声明也称为函数原型。#include  /* The parameter name, apple, has function prototype scope. These names are not significant outside the prototype itself. This is demonstrated below. */ int test_function(int apple);  // Function Prototype Scope int main(void) {     int orange = 5;     orange = test_function(orange);     printf("%dr ", orange); //orange = 6     return 0; } int test_function(int fruit) {     fruit += 1;     return fruit; }3 Function scope(函数作用域)
  Function scope is the special scope for labels. This is due to their unusual property. A label is visible through the entire function it is defined and one can jump (using instruction gotolabel) to it from any point in the same function.
  函数作用域是标号的特殊范围。这是因为它们的特殊属性。标号在定义的整个函数中都是可见的,可以从同一函数中的任意点跳转(使用指令gotolabel)到它。#include  #include  void close(FILE *fp){} void a_function(void) {      bool error = true;     double* a = (double*)malloc(sizeof(double[34]));     if (!a) {         fprintf(stderr,"can"t allocate ");         return; /* No point in freeing a if it is null */     }     FILE* b = fopen("some_file","r");     if (!b) {         fprintf(stderr,"can"t open ");         goto CLEANUP1; /* Free a; no point in closing b */     }     /* do something reasonable */         if (error) {         fprintf(stderr,"something"s wrong ");         goto CLEANUP2; /* Free a and close b to prevent leaks */     }     /* do yet something else */ CLEANUP2:     close(b); CLEANUP1:     free(a); } main(){}
  Labels such as CLEANUP1 and CLEANUP2 are special identifiers that behave differently from all other identifiers. They are visible from everywhere inside the function, even in places that are executed before the labeled statement, or even in places that could never be reached if none of the goto is executed. Labels are often written in lower-case rather than upper-case.
  CLEANUP1和CLEANUP2等标号是特殊标识符,其行为与所有其他标识符不同。它们在函数内部的任何地方都是可见的,甚至在标记语句之前执行的地方,或者如果没有执行goto,就永远无法到达的地方。标号通常用小写字母而不是大写字母书写。4 Block Scope(块作用域)
  An identifier has block scope if its corresponding declaration appears inside a block (parameter declaration in function definition apply). The scope ends at the end of the corresponding block.
  如果标识符的相应声明出现在块内,则该标识符具有块作用域(函数定义中的参数声明适用)。作用域在相应块的末尾结束。
  No different entities with the same identifier can have the same scope, but scopes may overlap. In case of overlapping scopes the only visible one is the one declared in the innermost scope.
  具有相同标识符的不同实体不能具有相同的作用域,但作用域可能重叠。对于重叠的作用域,唯一可见的是在最内层作用域中声明的作用域。#include  void test(int bar)  // bar has scope test function block {     int foo = 5;    // foo has scope test function block     {         int bar = 10;   // bar has scope inner block, this overlaps with previous                         // test:bar declaration, and it hides test:bar          printf("%d %d ", foo, bar);   // 5 10     } // end of scope for inner bar     printf("%d %d ", foo, bar);        // 5 5, here bar is test:bar } // end of scope for test:foo and test:bar  int main(void) {     int foo = 3;            // foo has scope main function block     printf("%d ", foo);    // 3     test(5);     printf("%d ", foo);    // 3     return 0; } // end of scope for main:foo5 File Scope(文件作用域)#include  /* The identifier, foo, is declared outside all blocks. It can be used anywhere after the declaration until the end of the translation unit. */ static int foo; // variable file scope staticc void test_function(void) // function file scope {     foo += 2; } const int cvar = 12; // 默认为文件作用域,当用exetern修饰且有初始化时,为全局作用域 int main(void) {     foo = 1;     test_function();     printf("%dr ", foo); //foo = 3;     return 0; }6 namespace scope(命名空间作用域)
  命名空间的成员名字具有命名空间作用域(namespace scope)。该名字的作用域从在该命名空间内的声明点直至当前编译单元内该命名空间的结尾处。使用using namespace语句可以提升该命名空间此时已经声明的名字到该using语句的作用域。
  使用限定符::,可以在命名空间名字的作用域内访问该命名空间的成员名字。
  C++引入了无名命名空间(unnamednamespace),其作用域即为当前编译单元。例如:
  namespace {int i;}
  也可以通过前面加上::限定访问文件作用域中的名字。 7 class scope(类作用域)
  类(class、struct、union)内定义的名字的作用域称为类作用域(class scope)。   这些名字在当前类的定义内部,以及类定义词法范围外的类成员定义中是可见的。因此,在类内部,成员名字可以先使用后定义,不必前向声明(forward declaration)。
  类静态数据成员具有外部链接属性。
  类的成员名字在其所在的类作用域内、或者派生类作用域内可见,或者通过 .运算符、->运算符、::限定符访问。
  匿名类的作用域, 这里的匿名类是指匿名struct、匿名class、匿名union,且没有直接用这种类型定义变量。如果紧随这些无名类型的定义之后,定义了该类型的变量,则类型的定义及使用与普通情况完全一样;严格说,这种情形可以不算是匿名类。
  匿名类作为嵌套类,即匿名类在一个外部类的内部定义:则编译器就在此处定义一个该匿名类的无名变量,并把该匿名类的成员的名字提升到该类型定义所在的外部类的作用域内。由于匿名类不能使用点运算符访问其成员,所以匿名类只能有数据成员,不允许有成员函数,也不能包含私有或受保护的数据成员。如果匿名类的定义是连续嵌套,则最内部的匿名类的成员名字被提升至最外部的非匿名类或可用变量访问的成员类之处。
  匿名类不作为嵌套类定义,即匿名类定义在一个全局函数内部或者全局函数外部。C/C++语言标准只允许匿名union在这种情形下定义;如果是匿名struct、匿名class,则编译报错。对于此种情形的匿名union,编译器同样在此处定义一个该匿名联合的无名变量,并把该匿名联合的成员的名字提升到该匿名联合所在的作用域内,匿名联合只能有数据成员,不允许有成员函数,也不能包含私有或受保护的数据成员。在函数外的匿名联合只能在当前编译单元内可见,因此必须使用static关键字,或者必须放在匿名命名空间中。
  例如: int main(){     union{         int test;         char c;     };     test=5; //匿名union的成员的名字提升到定义了该匿名union的作用域内。     struct { int i;} v; //匿名struct,但是紧随其后声明了一个变量v     v.i=101; // 编译通过     i=102; //编译报错: "i" wasnot declared in this scope|     return 0; }8 enumeration scope(枚举作用域)
  枚举作用域是指枚举类型的成员(enumerator)的名字的作用域,起自其声明之处,终至枚举定义结束之处。
  C语言规定,枚举类型的成员(enumerator)的可见范围被提升至该枚举类型所在的作用域内。这被认为有可能污染了外部的作用域。为此,C++11引入了枚举类(enum class)解决此问题。
  -End-

云米冰箱强推广告且不能关闭,会影响小米口碑吗?近日,有网友反馈,自己购买的云米带屏冰箱出现强制播放广告的情况,并且无法关闭。云米这一波动作,个人认为完全是一波骚炒作。冰箱大屏也不是一无是处,比如加点菜谱我就觉得不错,这加点广告小米起诉天极网获赔200万都还记得去年火烧小米电视的测评吧。据天眼查APP显示,9。23日,中国裁判文书网公开小米科技有限责任公司与重庆天极魅客科技有限公司不正当竞争纠纷一审民事判决书,案号(2020)渝0别克GL8迎来强敌,起亚第四代嘉华将于成都车展预售说起MPV,不得不提提别克GL8本田奥德赛跟五菱宏光,它们可以说是其中的标杆,深受消费者的喜爱,而起亚也抓住了这个时机,推出了第四代嘉华,新车将在成都车展开启预售,话不多说,一起来安全配置丰富,全新马自达CX30实车曝光,缤智迎来强敌近日我们通过神奇的海外媒体获悉了全新马自达CX30的实车图,新车未来将在国内正式上市,预计售价为12。9919。99万元,新车未来主要竞争对手依然锁定为日产逍客本田XRV本田缤智丰奔驰Citan厢式货车明年正式发布,打造高端纯电面包车说起面包车,我想大家首先会想到五菱宏光,它可以说是其中的标杆,有了它的存在,让别克GL8这么经典的MPV销量沦为千年老二,而奔驰也抓住了这个机遇,将于明年正式推出Citan纯电厢式坦克500领衔,成都车展自主重磅新车都在这里,没买车的有福了明天成都车展就正式拉开帷幕,今天就给大家盘点成都车展上的那些自主重磅新车,每一款都有自己的看家本领,没买车的同学们有福了!坦克500期待指数预售价2530万曾经的坦克600摇身一变硬派越野又多了一种选择,成都车展坦克400参上成都车展已经正式拉开帷幕,今天就给大家介绍一款自主硬派越野,他就是坦克400,新车跟坦克500同样定位为中大型SUV,只不过相比主打商务豪华的坦克500来说,坦克400的可玩性更强这3款SUV虽然销量差,但是品质不输主流SUV不知道从什么时候开始,SUV跟MPV成为国内汽车市场上的香饽饽,今天就给大家盘点几款销量惨淡的SUV,但品质不输主流SUV!如果您想追求个性时尚,不妨考虑一下它们!雪佛兰开拓者售价中国造出巨型运输车,彻底打破德国全球垄断,可装载航母行驶虽然咱们国内汽车工业发展较晚,但是现在已经有了比拼合资汽车品牌的实力,尤其是比亚迪长安长城奇瑞吉利等自主品牌,现在已经开始享誉全球,成为买车的首选,可谓是给国人争光。现在咱们国内不丰田塞纳的到来,能否撼动别克GL8的地位呢?不知道从什么时候开始,MPV跟SUV成为了国内汽车市场上的新宠,今天咱就来说说MPV,在咱们国内,别克GL8本田奥德赛五菱宏光可以说是绕不过去的三座大山,它们各自代表了商务家用经济广州机动车停放最新收费标准公布,新能源车主有福了近日广州机动车停放最新收费标准公布,一时间怎么停车,停车费用怎么收取成为了广州百姓最为关心的问题,今天就给大家说说这个收费标准。广州政府根据停车场类型时段地区时长等多方面制定了差异
音响销售面对面之我卖音响的这些年(连载1)8月18号下午三点半,大雨倾盆,我和另一位编辑部同事撑着伞,从广州淘金地铁站的B出口走到友谊商场大门,不到三分钟的时间,已经同落汤鸡无异。乘电梯上到五楼,转几个弯,就找到这间位于友音响销售面对面之我卖音响的这些年(连载2)前文回顾音响销售面对面之我卖音响的这些年(连载1)自我要求高,客户对你的信心才会提高骆永(化名),BO资深销售,从业超过15年2019年,我想过离开。在这个圈子待得太久了,也觉得有小而猛!Magnat四款代表性低音炮简介此前,我们对ELAC的多款低音炮做了简单的介绍。它们通过入墙吸顶和APP调校等多种技能,得以在任一空间实现隐身,令人印象深刻。不过,目前市面上多数低音炮仍是外摆式箱体且不配备APP慎点!据说听完这首歌的人都重回20岁最近不知道大家有没有被NewBoy刷屏,可能有些小伙伴没听过歌名,但或许已经被它是的我看见到处是阳光的旋律洗脑。为此昌老师特意去搜了一下这首歌,结果发现NewBoy是一首20年前的隐藏在后台默默地为用户输送动听音乐NADCI580V2四分区流媒体音乐播放器看到CI580V2的外形,再看看官方对它的描述,的确不容易让我想到这个一台四分区流媒体音乐播放器,毕竟它的样子跟我平时所见的同类型产品反差实在太大。CI580V2的面板除了1个电源搭建客厅影院,这么做,就对了!(连载三)搭建客厅影院,这么做,就对了!(连载二)前两期连载中,分别推荐了Soundbar和嵌墙挂墙以及吸顶安装的客厅影院,本期将迎来无线影院的推荐。无线影院并非新生事物。基于蓝牙WiFi传小投入,大升级PolkAudioMonitorXT系列音响是奢侈品吗?不,它可以成为像家具一样的日常用品。放眼目前的音响市场,入门级产品比比皆是。看似选择丰富,实则陷阱连连。相比于HiFi系统,选购家庭影院系统还会更复杂一些。在进行第佛山保利花园客厅影院清爽原木风住宅,享受午后惬意的大片基本情况简介实施方类别影音设计师案例类别客厅影院位置及周边概括性描述佛山南海桂城保利花园空间信息大约48用户使用需求想在客厅里搭建一套家人们都能享用的影院系统。设计师兼项目经理黄永美国EA(EliekAcoustic)HT系列威猛凌厉,专业范十足音响的销售不像普通日常用品那么简单,一手交钱一手交货就完事了,往往涉及搭配安装和调试的诸多环节。绝大部分品牌和厂家都在强调他们如何关心用户的感受和体验,但不得不承认的是,很多时候厂Apple收购Primephonic,料将推出自有古典音乐应用Apple(苹果)收购了古典音乐流媒体服务商Primephonic,以扩充其不断增长的曲库。目前,Apple宣称其音乐服务已有7500万首曲目。Primephonic在官网发布公告12周年,新的突破StarkeSoundP系列音箱正式发布在StarkeSound成立12周年之际,以突破之美为座右铭的StarkeSound,为大家带来了新的突破结合StarkeSound声音特色和目前国际音响行业顶尖技术的集大成之作P