C++编程规范之21:避免跨编译单元的初始化依赖

摘要:

    保持顺序,不同编译单元中的名字空间级对象决不应该在初始化上互相依赖,因为其初始化顺序是未定义的。这样做会惹出很多麻烦,轻则在项目中稍做修改就会引发奇怪的崩溃,重则出现严重的不可移植问题——即使是同一编译器的新版本也不行。

    在不同的编译单元中定义两个名字空间级的对象时,先调用哪一个对象的构造函数是没有定义的。经常工具可能会碰巧按照编译单元目标文件的连接顺序初始化,但这种假设并不总是可靠的;即使确实如此,你总不会希望自己的代码的正确性难以捉摸地依赖于makefile或者项目文件吧。

    因此,在任何名字空间级对象的初始化代码中,不能假设其他编译单元中定义的任何其他对象都已经初始化了。这些考虑方法也适用于动态初始化的原始类型变量。

    请注意,甚至在使用构造函数构造之前,名字空间级对象就已经使用0静态初始化过了。有些自相矛盾的是,这种零初始化会使错误更难以检查,因为静态的零初始化不会迅速使程序崩溃,而是使未初始化对象显现出一种看似合理的表象。你可能认为字符串是空的,指针是空的,整数型变量为0,而事实上,代码已经费劲地将它们初始化了。

    为了避免这一问题,应该尽可能地避免使用名字空间级的变量,它们很危险。如果确实需要可能依赖于另一个变量的此种变量,可以考虑使用singleton设计模式。使用时要小心一些,可以通过确保对象在第一次访问时被初始化,来避免隐含的依赖性。Singleton本质上也是全局变量,它会因为相互依赖或者循环依赖而被破坏。

时间: 2024-10-23 11:02:54

C++编程规范之21:避免跨编译单元的初始化依赖的相关文章

C++编程规范之48:在构造函数中使用初始化代替赋值

摘要:     设置一次,到处是用:在构造函数中,使用初始化代替复制来设置成员变量,能够防止发生不必要的运行时操作,而输入代码的工作量则保持不变.     构造函数会在系统内部生成初始化代码.考虑如下代码: class Employee { string firstName, lastName; public: Employee(){ firstName ="Leo"; lastName = "Chu" } };     实际上,生成的构造函数代码将类似于: Emp

Visual Basic编程规范

visual|编程|规范 Visual Basic编程规范 1.      Visual Basic IDE(集成开发环境)设置        必须打开设置选项的"要求变量声明","对齐控件到网格","自动缩进"开关.        Tab的宽度统一为4个空格,网格单位一律设为:width 60 height 60. 2.     命名约定        (注意:在任何时候,不能使用中文及全角字符,只允许使用英文字母.下划线和数字) 2.1   

IDesign C#编程规范(之四)

编程|规范 续之三,本文是IDesign C#编程规范的第三章. 3 项目设置和项目结构 Project Settings and Project Structure 1. 总是以4级警告建立项目(图略). Always build your project with warning level 4 2. 在发布版中将警告作为错误(注意这不是VS.NET的缺省设置)(图略). Treat warning as errors in Release build (note that this is

JAVA 编程规范

编程|规范 1. 应用范围 本规范应用于采用J2EE规范的项目中,所有项目中的JAVA代码(含JSP,SERVLET,JAVABEAN,EJB)均应遵守这个规范.同时,也可作为其它项目的参考. 2. 设计类和方法 2.1 创建具有很强内聚力的类 方法的重要性往往比类的重要性更容易理解,方法是指执行一个统一函数的一段代码.类常被错误的视为是一个仅仅用于存放方法的容器.有些开发人员甚至把这种思路作了进一步的发挥,将他们的所有方法放入单个类之中. 之所以不能正确的认识类的功能,原因之一是类的实现实际上

IDesign C#编程规范(一)

编程|规范 IDesign发布了C#编程规范,小鸡射手从Only4Gurus下载浏览后决心抽时间翻译一下,以更好地学习. 目录内容如下: 1 命名规则和风格 Naming Conventions and Style 2 编码惯例 Coding Practices 3 项目设置和结构 Project Settings and Structure 4 Framework特别指导 Framework Specific Guidelines 4.1 数据访问 Data Access 4.2 ASP.NE

IDesign C#编程规范(二)

编程|规范 续之一,小鸡射手接着翻译了IDesign编码规范的第二章前部. 2 编码惯例 Coding Practices 1. 避免在一个文件中放多个类. Avoid putting multiple classes in a single file. 2. 一个文件应该只对一个命名空间提供类型.避免在同一文件中有多个命名空间. A single file should only contribute types to a single namespace. Avoid having mult

IOS团队编程规范

本文讲的是IOS团队编程规范,需求是暂时的,只有变化才是永恒的,面向变化编程,而不是面向需求编程. 不要过分追求技巧,降低程序的可读性. 简洁的代码可以让bug无处藏身.要写出明显没有bug的代码,而不是没有明显bug的代码. 先把眼前的问题解决掉,解决好,再考虑将来的扩展问题. 一.命名规范 1.统一要求 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释,使用全称,不使用缩写. 2.类名 大驼峰式命名:每个单词的首字母都采用大写字母 ==例:== MFHomePageViewCo

《C++编程规范:101条规则、准则与最佳实践》——导读

前言 C++编程规范:101条规则.准则与最佳实践尽早进入正轨:以同样的方式实施同样的过程.不断积累惯用法.将其标准化.如此,你与莎士比亚之间的唯一区别将只是掌握惯用法的多少,而非词汇的多少. --Alan Perlis[1]} 标准最大的优点在于,它提供了如此多样的选择. --出处尚无定论 我们之所以编写本书,作为各开发团队编程规范的基础,有下面两个主要原因. 编程规范应该反映业界最久经考验的经验.它应该包含凝聚了经验和对语言的深刻理解的公认的惯用法.具体而言,编程规范应该牢固地建立在大量丰富

实现高效Java编程规范的十一条基础规则

编程|规范 本文介绍的Java规则的说明分为5个级别,级别1是最基本也是最重要的级别,在今后将陆续写出其他的规则.遵守了这些规则可以提高程序的效率.使代码有更好的可读性等. (1) 避免使用NEW关键字来创建String对象 把一个String常量copy到String 对象中通常是多余.浪费时间的. Public class test{ Public void method(){ System.out.print (str); } private String str = new String