MRT用户手册(中文)
MODIS REPROJECTION TOOL(MRT)中文用户手册以2011年4.1版本英文手册为基础目录自动批处理.MRT GUI(图形用户界面)重采样工具…36打开输入文件元数据检查…图幅位置:.:::::·:..::::::·:·.::::::::·:::::光谱子集40空间子集…指定输出文件42输出文件类型43重米样类型…43输出投影类型.44输出像元大小45加载或保存参数文件.…,45执行重采样…着,着看重46退出GU1.4文件格式转换46拼接工具47出版信息49联系方式49附录A:MRT参数文件格式文件命名约定50编辑参教文件50参数文件格式附录B:MR原始二进制文件.54文件命名规则.54头文件格式.54编辑头文件.提附录C:投影参数…投影参数18n曹非,非着音着音,音着音着投景参数915提示60MRT软件参数简介l999年12月,中分辨率成像光谱仪( MODIS)搭载美国宇航局(NASA)对地观测系统(EOS)平台的Tera卫星发射到太空。2002年5月,第二个 MODIS传感器搭载Aqua卫星发射。 MODIS的主要任务是对地球陆地、海洋和大气进行连续的全面观测;MOD比它的前任 AVHRR有更高的空间分辨率(250米、500米、1000米),比临轨的 Landsat7有更高的观测频率(近乎每天)。 MODIS的观测对于气候、植被、污染、全球变化以及其它很多重要的经济和环境问题的研究至关重要。MODS重投影工具( MODIS Reprojection Tool,MRT)被开发用于支持MODs陆地高级产品,这些 MODIS产品为HDF-FOS栅格文件,基于分嗝的 Sinusoidal(一种投影方式)投景2。MRT通过提供地图投影、格式转换和光谱与空间子集选项等功能方便」MODS陆地产品的应用,它被编译用于多种操作系统。MRT功能于 resample和 mrtmosaic两个可执行文件,这两个文件既可以在命令行运行,也可以在图形用户界面(GUⅠ)运行。GU在操作输入数据方面是种简便、友好的方式,而功能更强大的命令行方式主要用于满足用户海量数据处理需求。用户手册描述了如何运行 MRT resample和 mrimosaic两个程序。MRT软件参数平台MRT是一款高度可移植的软件,已在以下四种系统平台经过测试:● Windows nt+32-bit● Linux32-bitLinux 64-bit● Macintosh os X32-bit其它操作系统尽管没有经过测试,但预期是可以安装运行的(如 Windows vistaWindows7)。特定平台差异请参考 Release Notes更多MODS介绍请参见htp:/ modis gsfc. nasa. gov/.史多 HDF-EOS信息请参见htt:/Www.hdfgroup.org/和htp:/hdfeos.net4MRT软件参数(https://lpdaac.usgsgov/tools/modisreprojectiontool)界面MRT能以GU或命令行两种方式调用。GUI能满足用户对投影、格式转换或图幅拼接等功能的简单需求。同时它还可以轻松査看数据属性。基于脚本的命令行界面可进行多种命令执行,更适合大批量数据处理。数据产品MRT目前能对所有级别的MODS陆地栅格数据进行处理(包括2G级,3级,4级)。 MRTSwath支持条带数据处理(lB级,2级)3大多数 MOIDS数据是二维的,但也有一些三维或四维数据集(例如MCD43BRDF-Albedo suite4)。MRT攴持三维和四维数据产品,目前可以将他们输出为二进制、 GeoTIFF和HDF-EOS格式的二维数据产品文件格式MRT可以将二进制或 HDF-EOS格式的MoDS陆地产品作为输入文件。MRT输出文件格式包括二进制、HDF-EOS和 Geo TIFF。二进制文件格式在附录B中有说明数据类型MRT支持8-bit,16-bit,和32-bit整数数据(不论有没有符号),以及32-bit浮点数据。输出数据类型总是和输入数据相同地图投影MRT调用通用制图变换包(GCTP5),允许使用以下地图投影类型:3 MRTSwath详细介绍https://pdaac.usgs.gov/lpdaac/tools/modisreprojectiontoolswath4 MODIS多维数据信息https://lpdaac.usgsgov/lpdaac/products/modisproductstable/brdfalbedomodelparameters/16 day 3 global 500m/mcd43alo3GCTP详细说明htt:/ gcmd. nasa. gov/records/USGS- GCTP htmlMRT软件参数● Albers equal areaequirectan gularGeographicHaammelIntegerized SinusoidalInterrupted Goode homolosineLambert azimuthalLambert Conformal ConicMercator● MollweidePolar stereographicSinusoidalTransverse mercatorUniversal Transverse mercatorMRT所用的GCTP已被修改,整合了最初00版本MODS产品所用的 IntegerizedSinusoidal投影重采样MRT有三种重采样方式: nearest neighbor(NN, bilinear(BL,和 cubicconvolution(Cc)格式转换MRT输出文件格式有多个选项。可能的输入输出格式已在上文文件格式部分说过。格式转换支持波段子集和空间子集。在做格式转换时,重采样过程会被跳过。输出投影类型及投影参数并不需要,如果已指定,将被忽略。在格式转换时,输出投影与输入投影相同,投影参数也相同。输出像元大小也和输入一样(如果指定,将被忽略),数据类型也是这样。提醒:有一个简单的命令行工具(hdf2rb)能把HDF格式转换成二进制格式。它不依赖地理信息,因此在边界图幅(下文有相关小节说明)处理中应用效果好。MRT软件参数拼接工具MRT可以在图幅投影前对多个图幅进行拼接。在GU界面,可以通过选择多个输入文件进行图幅自动拼接。输入文件先被拼接,然后投影。在命令行界面,图幅拼接通过调用 mrtmosaic进行基准转换MRT只支持有限的几种输入输出基准( datum),包括NAD27、NAD83、WGS66WGS72以及WGS84。MRT支持用户对输出基准进行参数设置。GUI界面中用户可通过下拉列表选择输岀基准。软件默认 NODATUM。如果用命令行处理,则需在参数文件中对 DATUM参数进行设置,所用的基准需要MRT支持才行。如果参数文件中 DATUM项无值,则默认 NODATUM。基准是对参考椭球体半长轴和半短轴的标准定义。如果选择 NODATUM,则用户需要对除UTM和 Geographic外所有MRT支持的投影,设置前两个投影参数(即半长轴和半短轴),这两个参数措述投影的球体信息。如果选择 NODATUM的同时,个设置半长轴和半短轴,则MRT将会运行出错。需要注意的是,除 Sinusoidal和 Integerized sinusoidal两种投影类型外,目前对任意基于球体( sphere-based)的投影,GCTP包都自动采用球体19的半径(6370997米)。如果不想用球体19的半径,则用户必须用 NODATUM选项指定半径。对于 Integerized sinusoidal和 Sinusoidal投影,用户可以指定球体半径。尽管一种数据产品可能“参考”了某一基准,但用户必须明白,基于球体的投影在技术上没有基准。任何基于球体的输出都不包含任何基准信息。它包含的只是属于球体的信息。这取决于用户数据所参考的基准。并且, GCTP/Geolib软件在初始基准未知的情况下不能提供基准转换功能。因此,如果一种产品输出时没有基准,它就不能再用MRT转换成其他基准了基准值将被用于输出HDF-EOS, GCoTIFF和二进制文件。基准会在HDF文件中指定,尽管HDF-EOS不支持基准(根据HDF-EOS文档,HDF-EOS文件被假定参考WGS84)∏MRT知道了输入输出基准,并确定基准/投景参数组合有效,则重投影和基准转换叮执行。以卜是将SⅣN( MODIS数据所用投影类型)数据转投影为其它特定投影和基准输出的步骤。MRT软件参数用GCTP将输入数据投影到 Geographic投影。2.在 Geographic投影中将输入基准转换为输出基准。3.从 Geographic投影转到输出投影。步骤2和步骤3都通过调用 Geolib实现。如果输入数据不是SIN投影,则 Geolib在重投影和基准转换中只调用一次。光谱子集HDF-EOS输入文件一般包含多个图层,这被称为科学数据集(SDS)术语“SDS”可与本文中的术语“波段(band)”互换。输入波段集的仼意子集都冂以做重投影。默认重投景所有波段。空间子集个空间子集由矩形的两个角(左上角和右卜角)定义。这些角可以由输入绎纬度坐标,或输入行列数,或输岀投影的坐标来确定。默认用元数据中对边界矩形的措述来投影整个输入图像。输出像元大小MODIS实际空闾分辨率取决于卫星轨道位置,因此输入像元大小与所宣称的有定出入。比如,250米的产品实际包含231.7米的像元;500米的产品实际上有463.3米的像元;1000米的产品有926.6米的像儿。除非指定,MRT默认输出像元大小与输入像元大小相同。除输出Gε ographic地图栅格时像元大小以度来计量外,像元大小单位都是米。GUI中指定输出像元大小后,各波段输出像元大小相同;命令行中可以对不同波段设置不同的像元大小。参数文件不论是通过GUI调用,还是通过命令行调用,MRT都是在参数文件指挥下运行的。参数文件中有软件运行所需的各种信息,这些信息影响输入文件读取、投影转换以及结果输出等。参数文件包含输入输岀文件的文件名、文件格式、光谱与空间子集信息、输出投影类型、输出投影参数、输出的UTM带号(如果需要)输出重采样炎型、输出像元大小。参数文件能通过 MRT GU自动生成,并可保MRT软件参数仔以用于后续GUI或命令行运行。参数文件的文件名后缀为“,prm”,是 ASCII文本格式,可在仼意文本编辑器中创建或编辑。如果用户希望构造一个参数文件用于命令行执行,推荐从GUI创建基本参数文件开始,根据需要调整参数,以避免运行出错。参数文件格式在附录A中有描述元数据MRT从输入文件中提取文件相关信息,并在GUⅠ中显示,包括可用波段数量、数据类型、行列数、以及左上角和右下角位置。只能为输入的HD-EOS文件写输岀文件元数据(二进制输入文件不行)。输出的HDF文件包含输出元数据与原始输入文件元数据。输入结构( structure),核心(core),以及归档元数据( archive metadata)信息分别存储在HDF的OldstructMetadata, OldCore Metadata和 OldArchiveMetadata属性中。背景填充如果重釆样部位大多数值都是背景填充值,则输出背景填充值。否则,重采样在非背景值部位运行,并对权重作相应调整。MRT读取每一个输入波段的“ Fillvalue”,并用该值作为输岀背景填充值。如果 Fillvalue未指定,默认为0。提醒:对于部分MODS产品,填充值很高(如65535,而非一些用户习惯的低值或负值。在这些产品中,重采样图像中非图像数据也将被背景值填充。这导致实际像元被高亮度像元围绕。角坐标输出 GeoTIFF文件中左上角(UL)指左上角像元的中心。所有其他角都使用HDF标准表示其左上角和右下角(LR)的外部范围。因此,HDF-EOS和二进制文件MRT输出坐标表示的都是角位像元的左上角。所有GUI指定输出的角坐标,状态框中的角坐标,或命令行中的角坐标,标准输出或日志文件中的角坐标,都表示像元的外部范围。(lvge表示没有读懂,详情请査阅英文说明)日志文件MRT将日志和状态信息写入屏幕显示以及日志文件。日志文件被命名为resample log,并被放在bin目录下(如C: MRT bin resample log)。MRT活动的MRT软件参数详细信息在每次运行完成后附加到日志,因此MRT每次执行的历史都是有记录的。日志是文本文件,用户可以编辑或打印重采样工具的命令行版本允许用户用=g选项指定日志文件的路径和文件名。重采样工具选项将在“命令行界面”部分详细介绍。边界图幅边界图幅给MRT带来一些难题。这些图幅出现在 Sinusoidal全球投影的外边缘部分,如下图所示。MODIS Land Sinusoidal Mapping GridHorizontal Tile Number000102030405060708091011121314151617131920212223242526272829303132333435gsss+en①这些图幅由上到下、由左到石,从00开始标记。水平图幅标号从h00到h35,垂直标号从v00到v17。 MODIS HDE-EOS数据文件名中包含指定图幅水平及垂直位置标号。如,一个覆盖佛罗里达州的图嘔可能被命名为MOD13Q1A2011042h10v060520011060132568hdf,其中,“h10v06”指明了该图幅在 Sinusoidal网格中的位置边界图幅问题边界图幅很独特,因为它们包含不能以有效经纬度在地图上显示的投影角点。例如,覆盖阿拉斯加的图幅“h10√02”理论上具有沿着 Sinusoidal地球的远东和远西边缘的角点。边界图幅环绕 Sinusoidal地球边缘,这将坐标置于了不连续的空
- 2020-12-09下载
- 积分:1
华为C++语言编程规范
华为C++语言编程规范,内部资料se语言编程规范内部公开目录0说明前言代码总体原则与语言编程规范的关系规范实施、解释术语定义1常量62初始化和类型转换声明、定义与初始化类型转换3函数12内联函数函数参数函数指针4类...14类的设计构造、赋值和析构继承重载5作用域、模板和C+其他特性..25作用域模板其他6资源分配和释放287异常与错误处理33异常错误处理策略8标准库369程序效率语言特性的性能分级语言的性能优化指导华为机密,未经许可不得扩散第页共页se语言编程规范内部公开0并发4511风格48标小符命名与定义排版注释文件组织12可移植性(兼容性).4913全球化52多语言输入输出单一版本时区夏令时14业界编程规范和书籍55业界编程规编程指南《编程规范条规则、准则与最佳实践》《微软一站式示例代码库》扩展学习材料华为机密,未经许可不得扩散第页共页se语言编程规范内部公开语言编程规范0说明前言随着业务的发展和产品架构的演进,越来越多的传统电信产品使用C++语言,很多新型产品更是把C+作为首选。C艹继承于C,包含C的所有特性,同时又增加了新语言特性,如面向对象、泛型设计等。目前C-+使用现状是:基础技能薄弱,陷入很多误区,不能很好地发挥C++的作用。为了帮助团队合理使用C-+,规避语言陷阱,特制定本规范代码总体原则毘C语言编稈一样,C++编稈遵循通用原则:1、清晰第一。清晰性是易于维护、易于重构的程序必需只备的特征。2、简洁为美。简洁就是易于理解并且易于实现。3、选择合适的风格,与代码原有风格俣持一致。除此之外,C+编程还应该注意以下方面1、正确使用C+面向对象技术使得程序结枃清晰、简单,提高了代码的重用性,但又隐藏了很多內部实现细节,内存模型复杂,不小心会误入陷阱,比如:拷贝构造函数,赋值操作符,析构函数,重载等为了简化代码,改善代码结构,提髙编程效率,一些团队引入新特性和第三方库,如:模板技术、STL、Bost等,由于缺乏足够的理解,使用中屡次发生问题,比如对达代器( Iterator)使用不当导致功能失常,甚至稈序崩溃。所以,必须深入理解C艹+对象布局、內存模型等,了解编译器背后所做的处理,才能在编程中知道如何止确使用2、安全高效跟其他流行的高级语言、脚本语言相比,C艹+运行速度快,天然适合开发核心通信部件,但是这些部件对稳定性的要求非常高,不容许发生异常、失效以及崩溃。C艹-具有直接操作硬件、访问內存的能力提供了指针、地址运算等灵活特性,稈序员可以仟意发挥,增加了出锖的几率。所以在追求速度与灵峾性的冋同时,一定要注意保持程序的健壮性。在増强代码稳定性过桯中,程序员通常采用i-else等防御式编程,使得代码非常臃肿,可适当采用RAIⅠ、智能指针等技术华为机密,未经许可不得扩散第页共页se语言编程规范内部公开与语言编程规范的关系本文在《华为技术有限公司C语言编程规范》(简称C规范)基础上,通过详细阐述如何规避C++语言复杂性,避免C+-的低级错误,确保有效使用C-+语言特性,代码易于维扩。C规范里面相同的内容,夲规范不再重复。例如头文伻、变量、表达式、代码编辑与编译、可测试性安全性、单元测试等章节经过审妉,完全适合C+,本规范不再重复。标识符命名与定义、注祥、排版与柊式等内容也适合C++,仅仅添加了少量的C+特有的规则和建议,合并成风格一章;涵数章节增加了內联函数、函数参数等内容;可移植性増加了64位以及C艹+专冇的薮据转换等內容;质量保证也符合C艹+的需要,将资源分配和释放部分C艹特有的内容编写成单独章节;宏、常量也符合C++,考虑到C++普遍使用 cons t,增加了常属性( const)章节。新増初始化和类型转换,类,作用域、模板与C艹-其他特性,异常与错误处理,并发,全球化等C艹特有的内容本规范和C规范有沖突的地方,以本规范为准。规范实施、解释本规范制定了编写C+语言程序的基本原则、规则和建议。木规范适用于公司内使用C++语言编码的所有软件。本规范自发布之日起生效,对以后新编写的和修改的代码应遵守本规范本规范由软件工稈体系发布和维护。实施屮遇到问题,可以到论坛http://hi3ms.huaweicom/group/1735/threads.htmi上讨论。在某些情况下需要违反本规范给出的规则时,相关团队必须通过一个正式的沇程来评审、决貪规则违反的部分,个体程序员不得违反本规范中的相关规则。术语定义原则:编程时必须坚持的指导思想规则:编程时强制必须遵守的约定。建议:编程时必效加以考虑的约定说明:对此原则/规则/建议进行必要的解释。示例:对此原则/规则/建议从好、不好两个方面给出例子。延伸阅读材料:建议进一步阅读的参考材料。常量不变的值更易于理餡、跟踪和分析,所以应该尽可能地使用常量代替变量,定义值的时侯,应该把 const作为默认的选项规则1.1使用 const常量取代宏华为机密,未经许可不得扩散第页共页se语言编程规范内部公开说明:宏是简单的文本替换,在预处理阶段时完成,运行报错时直接报相应的值;跟踪调试时也是显示值,而不是宏名;宏没有类型检查,不安全;宏没有作用域。示例defi: e MAX MSISDN LEN(20)//不好的例子const int MAX MSISDN LEN=20;/好的例子规则1.2一组相关的整型常量应定义为枚举说明:之所以使用枚举,基于:●枚举比# define或 const int更安全,因为编译器会检查参数值是否是否位于枚举取值范围内,从而避免错误发生。示例//好的例子enum DayofWeek( sunday, monday, tuesday, wednesday, thursday, friday, saturday)ienum Ccloriblack, blue, whiter red, purp_e]BOOL CclorizeCalendar (DayofWeek today, Color todays Color)Coorizeca1 endor(b1ue, sunday);//编译报错,1ue和 Sunday位置错误//不好的例子:const int sunday=0iconst int monday= 1const int b⊥acKconst int blueBOOL CclorizeCalendar (int today, int todays ColorCoorizecalendar(blue, sunday);//不会报错当枚举值需要对应到具体数值时,须在声明时昰示赋值。否则不需要昰式赋值,以避免重复赋值,降低维护(增加、朋除成员)工作量示例好的例子:s协议里定义的设备I值,用于标识设备类型cnum TDcv-cclypcDEV UNKNOWN --l,DEV DSMP 0DEV工SMGDEV WAPPORTAL=2程序内部使用,仅用于分类的情況,不应该进行显式的赋值。示例/好的例子:程序中用来标识会话状态的枚举定义enum TSessionstateSESSION STATE INITISESSTON STATE CTOSEDSESSION STATE WA工TING●应当尽量避免枚举值亘复,如必须重复也要用己定义的枚举来修饰,例如:typed f enumRTCP SR 200,RTCP MIN TYPE RTCP SR//must be lowest known typeRTCP RR华为机密,未经许可不得扩散第页共页se语言编程规范内部公开RTCP SDES= 202RTCP BYE203,RTCP APP204,RTCP RTPFB=205RTCP PSEB =206/RTCP XR207RTCP RSI =208RTCP PUBPCRTS =209RTCP MAX TYPF= RTCP PUB PORTS //must be highest known typertcp type ti规则1.3不相关的常量,即使取值一样,也必须分别定义说明:一个常量只用来表示一个特定功能,即一个常量不能有多种用途。示例:/好的例子:协议和协议B,于机号( (MSISDN)的长度都是20。unsigned const int. A MAX MST SDN LEN0;unsigned const int B MAX MSI SDN LEN 20//或者使用不同的名字空间namespace alibunsigned const int MAX MSISDN LEN=20;namespace blibunsigned const int MAX MSISDN LEN =20建议1.1尽可能使用 const说明:在声明的变量或参数前加上关键字 const用于指明变量值不可被篡改。类成员函数加上 const限定符表明该函数不会修改类成员变量的状态使用 const常见的场景:函数参数:传递引用时,如果函数不会修改传入参数,该形参应声明为 const。成员函数:访问函数(如get函数):不修改任何数据成员的函数:未调用非 cons t函数、未返回数据成员的非 const指针或引用的函数。数据成员:如果数据成员在对象构造之后个再发生变化,可将其定义为 cons t。2初始化和类型转换声明、定义与初始化规则2.1禁止用 memcpy、 memset初始化非POD对象说明:PO全称是“ Plain0 ld Data”,是C++98标准(ISO/IEC14882, first edition,19980901)中引入的一个概念,POD类型主要包括int,char, float, double, enumeration,woid,指针等原始类型及其集合类型,不能使用封装和面对对象特性(如用户定义的构造/赋值/析构函数、基类、虚函数等)。华为机密,未经许可不得扩散第页共页se语言编程规范内部公开由于非P0D类型比如非集合类型的 class对象,可能存在虚函数,内存布局不确定,跟编译器有关,滥用内存拷贝可能会导致严重的问题即使对集合类型的 class,使用直接的内存拷贝和比较,破坏了信息隐蔽和数据保护的作用,也不提倡memcpy、 memset操作示例:×××产品程序异常退出( corc dump)。经过现场环境的模似,程序产生 COREDUMP,其原因是:在初始化函数内使用 memset(this,0,sizeof(*this))进行了类的初始化,将类的虚函数表指针被清空,从而导致使用空指针。解决方案:使用C艹构造函数初始化,不要便用 memset函数初始化类对象建议2.1变量使用时才声明并初始化说明:变量在使用前未赋初值,是常见的低级编程错误。使用前才声明变量并同时初始化,非常方便地避免了此类低级错误。在函数开始位置声明所有变量,后面才使用变量,作用域覆盖整个函数实现,容易导致如下问题:程序难以理解和维护:变量的定义与使用分离变量难以合理初始化:在函数丌始时,经常没有足够的笮息进行变量初始化,往往用某个默认的空值(比如零)来初始化,这遥常是一种浪费,如果变量在被赋于有效值以前使用,还会导致错误。遵循变量作用域最小化原则与魷近声明原则,使得代码更容易阅读,方便了解变量的类型和初始值特别是,应使用初始化的方式替代声明再赋值示例:不好的例子:声明与初始化分离string name;//声明时未初始化:调用缺省构造函数nane=" zhangsan";//再次调用赋值操作符函数;声明与定义在不同的地方,理解相对困难好的例子:声明与初始化一体,理解相对容易string name(" zhangsan");//调用一次构造函数建议2.2避免构造函数做复杂的初始化,可以使用“init”函数说明:正如函数的变量都在函数内部初始化一样,类数据成员最好的初始化场所就是构造函数,数据成员都应该尽量在构造函数中初始化以下情况可以使用init(函数来初始化:需要提供初始化返回信息。数据成员初始化可能抛异常。●数据成员初始化大败会造成该类对象初始化失败,引起不确定状态数据成员初始化依赖this揞针:构造凶数没结束,对象就没有构造出来,构造凶数內不能使用this成员数据成员初始化需要调用虚函数。在构造函数和析构函数中调用虚函数,会导致未定乂的行为示例:数据成员初始化可能拋异常:cl ass CPPRule华为机密,未经许可不得扩散第页共页se语言编程规范内部公开publicCEPRule(): size (0), res (null)i//仅进行值初始化long init (int size)//根据传入的参数初始化size,分配资源resr vateint siResourceptrx res//使用方法CPPRule ait(100)建议2.3初始化列表要严格按照成员声明顺序来初始化它们说明:编译器会按照数据成员在类定义中声明的顺序进行初始化,而不是按照初始化列表中的顺序,如果打乱初始化列表的顺序实际上不起作用,但会造成阅读和理解上的混淆;特别是成员变量之间存在依赖关系时可能导致BUG示例://不好的例子:初始化顺序与声明顺序不一致class Emp-oyeepublic:Employee(const charx firstName, const charx lastNamefirstName (firstName), lastName (lastName)r email (firstName.+-astName t huawei. com)ipr-vate:string email, firstName lastName类定义emai1是在 firstName, lastName之前声明,它将首先初始化,但使用了未初始化的ratNam和 lastName,导致错误。在成员声明时,应按照成员相互依赖关系按顺序声明。建议2.4明确有外部依赖关系的全局与静态对象的初始化顺序说明:如果全尻对象A的成员变量有外部依赖,比如依赖另外一个全局变量B,在A的构造函数中访问B,隐含的规则就是B先于A初始化,然而全局与静态对象的初始化与析构顺序未有严格定义,无法确保B已经完成初始化,而每次生成可执行程序都可能发生变化,这类BUG难以定位。通常采用单件( Singleton)模式或者把有依赖关系的全局对象放在一个文件中定义来明确初始化顺序冋一个文件屮,若全局对象a在全局对象b之前定义,则a一定会在b之前初始化;但是不同文件中的全局对象就没有固定的初始化顺序。可以在main0或 pthread once(内初始化一个运行期间不回收的指针类型转换避免使用类型分支来定制行为:类型分支来定制行为容易出错,是企图用C+编写C代码的明显标志。这是一种很不灵活的技术,要添加新类型时,如果忘记修改所有分支,编译器也不会告知。使用模板和虚函数,让类型自己而不是调用它们的代码来决定行为。华为机密,未经许可不得扩散第页共页
- 2020-12-12下载
- 积分:1