Google C++编程规范学习--头文件
2016-12-11 23:41
260 查看
1、使用#define防止多次包含(multiple inclusion),宏命令规则:project_path_file_H_,如项目test中include目录下一个文件foo.h,宏定义为:#define TEST_INCLUDE_FOO_H_;
2、尽量使用前向声明代替头文件包含。原因:
A文件包含:
B.h
C.h
B或C头文件发生变化时,编译时A文件及依赖A.h的所有文件都要重新编译。
头文件中可以使用前向声明代替头文件包含情况有:
1)、指针或引用变量;
2)、参数、返回值类型的函数(只能是声明,不能包含实现,实现放到cpp文件中情况);
3)、静态数据成员的声明。
如:
#ifndef GOOGLEFORMATCODE_FORWARDDECLARATION_H_
#define GOOGLEFORMATCODE_FORWARDDECLARATION_H_
class CTestA;
class CForwardDeclaration
{
public:
CForwardDeclaration();
~CForwardDeclaration() {}
public:
void SetTestA(const CTestA& testA);
CTestA GetTestA();
void SetTestATwo(CTestA testA);
private:
CTestA* m_pTestA;
CTestA& m_TestA;
static CTestA s_TestA;
};
#endif
3、内联函数的使用,一般有以下规则:
1)、代码行数小于10行的;
2)、不能包含有循环、条件语句;
3)、virtual、递归函数不能是内联函数;
4)、内联函数比较复杂时,实现可以放到以-inl.h结尾的文件中(注意,这个文件也需要#define保护,防止多次包含)。
内联函数和普通函数一个比较大区别:代码调用内联函数会类似调用宏定义,会把代码在调用的地方展开;而普通函数会做一些记录,然后跑到函数中执行,执行结束后再返回,继续执行剩下的语句。
4、函数参数,一般输入参数在前,输出参数在后(有些参数可能再者皆有,所以,这个参数顺序规则不强制要求)。
5、包含文件的名称和次序:将包含次序标准化可增强可读性、避免隐藏依赖。
包含的名称避免使用.(当前目录)和..(父目录)这种UNIX文件路径。
包含次序:C库、C++库、其他库的.h、项目内的.h。
例如:
A.h
struct BS bs;
...
B.h
struct BS{
....
};
在A.c中
//这样会报错
#include A.h
#include B.h
//先包含B.h就可以
#include B.h
#include A.h
一般解决要么在.h文件中包含B.h文件或是在.h中使用前向声明(如果可以,更推荐使用前向声明)。
这样就叫"隐藏依赖"
参考:http://www.cnblogs.com/HappyYouxi/archive/2014/04/15/3666476.html
2、尽量使用前向声明代替头文件包含。原因:
A文件包含:
B.h
C.h
B或C头文件发生变化时,编译时A文件及依赖A.h的所有文件都要重新编译。
头文件中可以使用前向声明代替头文件包含情况有:
1)、指针或引用变量;
2)、参数、返回值类型的函数(只能是声明,不能包含实现,实现放到cpp文件中情况);
3)、静态数据成员的声明。
如:
#ifndef GOOGLEFORMATCODE_FORWARDDECLARATION_H_
#define GOOGLEFORMATCODE_FORWARDDECLARATION_H_
class CTestA;
class CForwardDeclaration
{
public:
CForwardDeclaration();
~CForwardDeclaration() {}
public:
void SetTestA(const CTestA& testA);
CTestA GetTestA();
void SetTestATwo(CTestA testA);
private:
CTestA* m_pTestA;
CTestA& m_TestA;
static CTestA s_TestA;
};
#endif
3、内联函数的使用,一般有以下规则:
1)、代码行数小于10行的;
2)、不能包含有循环、条件语句;
3)、virtual、递归函数不能是内联函数;
4)、内联函数比较复杂时,实现可以放到以-inl.h结尾的文件中(注意,这个文件也需要#define保护,防止多次包含)。
内联函数和普通函数一个比较大区别:代码调用内联函数会类似调用宏定义,会把代码在调用的地方展开;而普通函数会做一些记录,然后跑到函数中执行,执行结束后再返回,继续执行剩下的语句。
4、函数参数,一般输入参数在前,输出参数在后(有些参数可能再者皆有,所以,这个参数顺序规则不强制要求)。
5、包含文件的名称和次序:将包含次序标准化可增强可读性、避免隐藏依赖。
包含的名称避免使用.(当前目录)和..(父目录)这种UNIX文件路径。
包含次序:C库、C++库、其他库的.h、项目内的.h。
例如:
A.h
struct BS bs;
...
B.h
struct BS{
....
};
在A.c中
//这样会报错
#include A.h
#include B.h
//先包含B.h就可以
#include B.h
#include A.h
一般解决要么在.h文件中包含B.h文件或是在.h中使用前向声明(如果可以,更推荐使用前向声明)。
这样就叫"隐藏依赖"
参考:http://www.cnblogs.com/HappyYouxi/archive/2014/04/15/3666476.html
相关文章推荐
- 项目文件跟Google学习Android开发-工具篇-Android Studio入门
- 转:Google论文之二----Google文件系统(GFS)翻译学习
- Google C++编程规范 1 头文件
- Google PB协议学习记录--一个简单的例子--如何编译.proto文件为.java文件
- Google论文之二----Google文件系统(GFS)翻译学习
- 向google学习良好的C++代码风格-(2)头文件
- Tensorflow 实战google深度学习框架 10 pb文件的保存&加载
- 【Java学习】JAR 文件格式的强大功能
- jdom学习(1)建立XML文件(转)
- struts学习心得--资源文件
- [Java学习]使用digester 解析xml配置文件
- hibernate学习:hibernate.cfg.xml文件中与数据库的两种连接
- [我的ASP.net学习历程]有关于.dll文件的迷惑
- 原创的ASP文件上传函数库,比动网、amao的都差了很多,不过是学习的好资料
- 内存映射文件的学习
- Properties属性文件学习
- 用google学习英语不错!
- 学习如何在程序中调用.exe文件
- [我的ASP.net学习历程]有关于.dll文件的迷惑
- VC学习资料收集(8):用Visual C++操作INI文件