1. #define的保护

全部头文件都应该使用#define 防止头文件被多重包括(multiple inclusion)。命名格式

当是:<PROJECT>_<PATH>_<FILE>_H_

为保证唯一性,头文件的命名应基于其所在项目源码树的全路径。比如,项目foo 中的头

文件foo/src/bar/baz.h 按例如以下方式保护:

#ifndef FOO_BAR_BAZ_H_

#define FOO_BAR_BAZ_H_

...

#endif // FOO_BAR_BAZ_H_

2. 头文件依赖

使用前置声明(forward declarations)尽量降低.h 文件里#include 的数量。

当一个头文件被包括的同一时候也引入了一项新的依赖(dependency),仅仅要该头文件被改动。

代码就要又一次编译。假设你的头文件包括了其它头文件。这些头文件的不论什么改变也将导致那

些包括了你的头文件的代码又一次编译。

因此,我们宁可尽量少包括头文件。尤其是那些包括

在其它头文件里的。

使用前置声明能够显著降低须要包括的头文件数量。

举例说明:头文件里用到类File。但不

须要訪问File 的声明,则头文件里仅仅需前置声明class File;无需#include

"file/base/file.h"。

在头文件怎样做到使用类Foo 而无需訪问类的定义?

1) 将数据成员类型声明为Foo *或Foo &;

2) 參数、返回值类型为Foo 的函数仅仅是声明(但不定义实现);

3) 静态数据成员的类型能够被声明为Foo,由于静态数据成员的定义在类定义之外。

还有一方面,假设你的类是Foo 的子类,或者含有类型为Foo 的非静态数据成员,则必须为

之包括头文件。

有时。使用指针成员(pointer members。假设是scoped_ptr 更好)替代对象成员(object

members)的确更有意义。

然而,这种做法会减少代码可读性及运行效率。假设只为

了少包括头文件。还是不要这样替代的好。

当然,.cc 文件不管怎样都须要所使用类的定义部分,自然也就会包括若干头文件。

译者注:能依赖声明的就不要依赖定义。

以上是Google中C++编程规范的前两条要求。第一条相信大家都知道。第二条就是我要说的问题了。

这里我用VS2012解释下这个事情。要降低编译的目的就是要降低#include;

那我们先定义这样两个类:

#pragma once
class A
{
public:
A(void);
~A(void);
};
#pragma once
#include "A.h"
class B
{
public:
B(void);
~B(void);
private:
A a;
};

能够看到这是非常easy的组合类的情况。B类中有个A的对象。以下我们生成一下。

这时候A。B第一次编译成功

接下来我们改动对象A,在对象A中添加一个私有成员i,B不变;

#pragma once
class A
{
public:
A(void);
~A(void);
private:
int i;
};

这时候再生成一次,能够看到例如以下情况

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVlanVlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

能够看到A编译后。编译器发现B中导入了A.h然后又编译了一次B。

在project量比較小的时候这么做是没关系的。但当你编译一次代码须要1分钟2分钟的时候。我们频繁的改动源代码然后编译你会崩溃的是不是?

所以前置声明是一个能够选择的解决方式。

B的代码仅仅要做例如以下改动,取消导入A.h在B.h中声明class A;

#pragma once
class A;
class B
{
public:
B(void);
~B(void);
private
A* a;
};

我们相同在A没改动之前做一次编译。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGVlanVlbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

相同我们在A中增加私有成员后再编译一次。

能够看到这里仅仅编译了A.cpp文件。

这样的原因就是事实上是C++的声明与定义并未全然分离的缘故。像Java就不会有这样的问题=。

=

C++编程技巧降低编译时间的更多相关文章

  1. 从linux内核中学到的编程技巧 【转】

     从linux内核中学到的编程技巧  分类: LINUX 1构建泛型宏 (./linux/include/linux/kernel.h) #define min(x, y) ({ \ typeof(x ...

  2. 减少C++代码编译时间的方法

    c++ 的代码包含头文件和实现文件两部分, 头文件一般是提供给别人(也叫客户)使用的, 但是一旦头文件发生改变,不管多小的变化,所有引用他的文件就必须重新编译,编译就要花时间,假如你做的工程比较大(比 ...

  3. java命名规范和编程技巧

    一个好的java程序首先命名要规范. 命名规范 定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,方便维护等作用 Package 的命名 Package 的名字应该都是由一个小写 ...

  4. 深入理解C#:编程技巧总结(二)

    原创文章,转载请注明出处! 以下总结参阅了:MSDN文档.<C#高级编程>.<C#本质论>.前辈们的博客等资料,如有不正确的地方,请帮忙及时指出!以免误导! 在上一篇 深入理解 ...

  5. 15个提高编程技巧的JavaScript工具

    原文地址:http://www.imooc.com/wenda/detail/243523 JavaScript脚本库是一个预先用JavaScript语言写好的库,它方便了我们开发基于JavaScri ...

  6. Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)

    原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...

  7. Matlab.NET混合编程技巧之——找出Matlab内置函数

    原文:[原创]Matlab.NET混合编程技巧之--找出Matlab内置函数 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破 ...

  8. 18个Python高效编程技巧,Mark!

    初识Python语言,觉得python满足了我上学时候对编程语言的所有要求.python语言的高效编程技巧让我们这些大学曾经苦逼学了四年c或者c++的人,兴奋的不行不行的,终于解脱了.高级语言,如果做 ...

  9. 关于ThinkPHP的一些编程技巧

    在TP学习过程中难免会遇到一些大大小小的问题,把这些问题积累下来就可以在以后遇到时能很快速的解决,提高编程效率. 1.让Runtime下的文件格式化:入口文件处:define(‘STRIP_RUNTI ...

随机推荐

  1. 牛客网-《剑指offer》-矩形覆盖

    题目:http://www.nowcoder.com/practice/72a5a919508a4251859fb2cfb987a0e6 C++ class Solution { public: in ...

  2. MDX Step by Step 读书笔记(八) - Navigating Hierarchies 层次结构导航

    开篇介绍 本章主要内容包括: 解释各种不同的 MDX 导航函数的使用: Parent, Children, FirstChild, LastChild, Siblings, FirstSibling, ...

  3. 深度学习-Caffe编译测试的小总结

    1. 搭建的环境和代码:win7 64bit + vs2013+CUDA7.5 http://blog.csdn.net/thesby/article/details/50880802 2. 编译,制 ...

  4. Android 调用webservice并解析

    这是调用webService的具体方法 private final static String nameSpace="http://tempuri.org/"; private f ...

  5. SQL Server删除log文件

    数据库文件太大 SQL Server用的久了,会发现备份文件越来越大,这个其实主要是log文件的增加,删掉log文件就可以了.不过操作之前最好还是有个完整备份的好. 分离数据库 分离数据库,勾选删除链 ...

  6. 定制保存top输出信息的格式详解

    top命令的重要性和使用方法不多说了,这里终点讨论如何保存top命令的输出信息.     保存top命令的输出到一个文件的方法是:top -n1b > topinfo.txt,这没什么好奇的,但 ...

  7. Python2.7.14新手学习

    python2.7.14 让用户选择一个功能,然后对其进行操作的例子.中间有问题的是年龄没有做是否是数字判断 注意:和版本python3不同的地方 1.编码 2.输入地方是raw_input 3.业务 ...

  8. 《鸟哥的Linux私房菜》学习笔记0——计算机概论

    一:CPU架构 精简指令集CPU:SPARC系列.PowerPC系列.ARM系列.其中,ARM CPU广泛应用于手机.PDA.导航系统等设备. 复杂指令集CPU:x86架构的CPU,大量用于个人电脑, ...

  9. CentOS7 vsftp使用ftp客户端登录时不同的用户进入到不同的文件夹方法

    anonymous_enable=NO local_enable=YES write_enable=YES local_umask=777 #anon_upload_enable=YES #anon_ ...

  10. java与C#、.NET AES加密、解密 解决方案

      1.情景展示 Java提供的密钥,C#无法解密. 2.原因分析 在Java中,AES的实际密钥需要用到KeyGenerator 和 SecureRandom,但是C#和.NET 里面没有这2个类, ...