转自:http://roclinux.cn/?p=3285

本原创文章属于《Linux大棚》博客。

博客地址为http://roclinux.cn

文章作者为roc wu

==

【规范】

对于普通的类,建议使用前置声明,而不是#include。

【什么是前置声明】

在英文中,前置声明称为“forward declaration”,是指“对类、函数或模板进行声明,且不含相关的具体定义”。我们可以使用前置声明来代替那些用于声明的#include语句。

【支持者的声音】

过多的#include会导致编译器打开很多的文件,并处理很多的输入内容。另外,当头文件内容修改时,也会导致更多次的重新编译。

如果我们使用前置声明,可以避免上述问题。

【反对者的声音】

  1. 在使用模板、typedef、默认参数等语法时,我们就比较难确定前置声明的正确形式了 ;
  2. 对于一段代码片段,我们很难决定是使用前置声明还是使用#include,尤其是在有隐式转换操作时。在一些极端情况下,用前置声明代替#include会完全改变代码的原意。
  3. 如果要前置声明过多的内容,会显得很冗余拖沓,不如#include简单。
  4. 对函数和模板的前置声明,会阻碍原作者对函数或模板的改进,比如调整一个参数的类型,给模板的参数增加一个默认值等。
  5. 对名字空间std::中标记的前置声明,经常会产生“未定义”的报错。
  6. 如果特意调整代码以便使用前置声明,往往会使得代码运行变慢,代码逻辑变复杂,比如用指针成员代替对象成员等。
  7. 前置声明对代码效率的收益,目前也没有得到有力的证明。

【结论】

  1. 如果要使用头文件中的某个函数,请使用#include方法引用头文件
  2. 如果要使用头文件中的某个类模板,请使用#include方法引用头文件
  3. 如果要使用某个普通的类,建议使用前置声明。
  4. 不必只是为了避免使用#include,而用指针成员替代对象成员。

谢谢!

Google C++编程规范 – 第十九条 -《前置声明》的更多相关文章

  1. 一张图总结Google C++编程规范(Google C++ Style Guide)

    Google C++ Style Guide是一份不错的C++编码指南,我制作了一张比較全面的说明图,能够在短时间内高速掌握规范的重点内容.只是规范毕竟是人定的,记得活学活用.看图前别忘了阅读以下三条 ...

  2. Google Python编程规范

    http://pan.baidu.com/s/1dD1Ra7J 其他语言的编程风格: http://zh-google-styleguide.readthedocs.org/en/latest/

  3. Google C++ 编程规范总结

    一.头文件 #define 的保护 项目 foo 中的头文件 foo/src/bar/baz.h 按如下方式保护: #ifndef FOO_BAR_BAZ_H_ #define FOO_BAR_BAZ ...

  4. FangDD Java编程规范

    我们采用<Oracle/Sun原生的Java编程规范>和<Google Java编程规范> Google Java编程风格指南 January 20, 2014 作者:Haws ...

  5. C++的一些编程规范(基于google)

    1.所有头文件都应该使用#define 防止头文件被多重包含,命名格式可以参考<PROJECT>_<PATH>_<FILE>_H 2.使用前置声明尽量减少.h文件中 ...

  6. Java学习笔记(五)——google java编程风格指南(中)

    [前面的话] 年后开始正式上班,计划着想做很多事情,但是总会有这样那样的打扰,不知道是自己要求太高还是自我的奋斗意识不够?接下来好好加油.好好学学技术,好好学习英语,好好学习做点自己喜欢的事情,趁着自 ...

  7. 华为C语言编程规范

    DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...

  8. Google C++编程风格指南 - 中文版

    Google C++编程风格指南 - 中文版 from http://code.google.com/p/google-styleguide/ 版本: 3.133原作者: Benjy Weinberg ...

  9. 《C+编程规范 101条规则、准则与最佳实践》笔记

    <C+编程规范 101条规则.准则与最佳实践> 0.不要拘泥于小节(了解哪些东西不应该标准化) * 与组织内现有编码规范一致即可 * 包括但不限于: - 缩进 - 行长度 - 命名规范 - ...

随机推荐

  1. 关于java post get请求Demo (请求c#iis接口)

    废话不多说,直接上代码 package dxq.httpGetDemo; import java.io.ByteArrayOutputStream; import java.io.InputStrea ...

  2. 7-10 公路村村通(30 分)(最小生成树Prim算法)

    7-10 公路村村通(30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1 ...

  3. c#中的委托和事件详细学习【分6页学习】

    原文发布时间为:2008-11-01 -- 来源于本人的百度文章 [由搬家工具导入] 在本文中我首先通过一个GreetingPeople的小程序向大家介绍了委托的概念、委托用来做什么,随后又引出了事件 ...

  4. poj-1979 && hdoj - 1312 Red and Black (简单dfs)

    http://poj.org/problem?id=1979 基础搜索. #include <iostream> #include <cstdio> #include < ...

  5. Ubuntu 16.04中XMind 8导致Java内存溢出的问题解决(硬盘卡死,桌面卡死)

    XMind使用的是Java进行开发,如果出现内存溢出的问题,那么一定是桌面快捷方式的问题,解决方法是直接修改快捷方式里面的内容,修改如下: [Desktop Entry] Encoding=UTF-8 ...

  6. Mac 系统引导过程概述 & BootCamp 的秘密

    http://bbs.feng.com/read-htm-tid-6890655.html

  7. Oracle生成多表触发器sql

    --将所有HY开头的表都生成一个更新触发器的脚本('/'是为了连续创建多个触发器而不报错)select 'CREATE OR REPLACE TRIGGER '||table_name||' BEFO ...

  8. mybatis resultmap标签type属性什么意思

    mybatis resultmap标签type属性什么意思? :就表示被转换的对象啊,被转换成object的类型啊 <resultMap id="BaseResultMap" ...

  9. [Spring] Bean Scope Singleton cs Prototype

    We can define a class to be Singleton or Prototype. If the class was defined as Prototype, then ever ...

  10. 码农小汪-spring框架学习之2-spring IoC and Beans 控制反转 依赖注入 ApplicationContext BeanFactory

    spring Ioc依赖注入控制反转 事实上这个东西很好理解的,并非那么的复杂. 当某个Java对象,须要调用还有一个Java对象的时候(被依赖的对象)的方法时.曾经我们的做法是怎么做呢?主动的去创建 ...