【C++ 学习】03 做个遵纪守法的Coder
说明
本系列文章是对C++ primer 第五版学习的相应的学习记录总结。
本文将对学习C++时常用的编程Tips进行总结,以便编出健壮的代码。(本文将持续更新)
资料推荐
如何做一个个遵纪守法的Coder呢?有以下的书籍可以好好参考
Effective C++:改善程序与设计的55个具体做法
Effective STL中文版
当然,C++ primer中的一些建议,也是很有价值的。
记录
chapter 1
1.1 注释界定符号不能嵌套(P9页)
- Comment Pairs Do Not Nest, A comment that begins with /* ends with the next */. As a result, one comment pair
cannot appear inside another.
/*
* comment pairs /* */ cannot nest.
* ''cannot nest'' is considered source code,
* as is the rest of the program
*/
int main()
{
return 0;
}
1.2 #include头文件的问题
As we’ve seen, to use a library facility, we must include the associated header.Similarly, we use headers to access classes defined for our own applications.Conventionally, header file names are derived from the name of a class defined in that header. Header files that we write usually have a suffix of .h, but some programmersuse .H, .hpp, or .hxx. The standard library headers typically have no suffix at all.Compilers usually don’t care about the form of header file names, but IDEs sometimes do. (P20)
无论这个文件是C++提供的还是自己编写的,使用#include “文件名”命令一定是正确的。
#include <文件名>:包含C++提供的头文件时,应该使用尖括号。
#include “文件名”: 自定义头文件用“”,先在当前文件所在的目录搜索是否有符合的文件,如果没有再到Include文件夹里去找对应的文件。关于标准的尖括号 参考
最新的C++标准中,包含C++提供的头文件并不是写作#include <文件名>
, 如#include <iostream.h>
的写法是过时的。正确的写法是#include <iostream>
,并且要使用std名字空间。
chapter 2
2.1防止重复包含头文件,“头文件卫士”加以保护
Headers should have guards, even if they aren’t (yet) included by another header. Header guards are trivial to write, and by habitually defining them you don’t need to decide whether they are needed.(page 68)
假设,我们的工程中有如下三个文件:a.h、b.h和c.cpp,其中b文件中包含了a.h,c文件中又分别包含了a.h和b.h两个文件,如图所示。
图 工程文件示例
在编译整个工程时,编译器会出现“multiple definition of”错误。原因在于a.h文件被包含了两次。为了避免同一个文件被包含多次,C/C++中有两种处理方式,一种是#ifndef方式,另一种是#pragma once方式。
方式1:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 声明、定义语句
#endif
方式2:
#pragma once
... ... // 声明、定义语句
#pragma once方式一般由编译器提供,不受C/C++语言标准支持,GCC已经取消了对其的支持,而微软的VC++却仍在坚持。它保证同一个文件不会被包含多次。这里所说的“同一个文件”指的是物理上的一个文件,而不是指内容相同的两个文件。#pragma once声明只针对文件,而不能针对某一文件中的一段代码。这种方式避免了因想方设法定义一个独一无二的宏而产生的烦恼;另外,针对大型项目的编译速度也有了提升。参考
C/C++语言标准支持第一种方式。
#ifndef _PROJECT_PATH_FILE_H_
#define _PROJECT_PATH_FILE_H_
... ... // 声明、定义语句
#endif
所有头文件都应该使用“头文件卫士” #define 来防止头文件被多重包含
为保证唯一性, 头文件的命名应该基于所在项目源代码树的全路径. 例如, 项目 foo 中的头文件 foo/src/bar/baz.h 可按如下方式保护:
#ifndef FOO_BAR_BAZ_H_
#define FOO_BAR_BAZ_H_
…
#endif // FOO_BAR_BAZ_H_
重复定义的问题
- 头文件中只可以放置函数声明,不可以放置函数定义吗?
- 为什么有些头文件中直接把函数定义都写进去了?
- 模板函数/类中要求头文件中必须包含定义才能进行模板实例化,这种定义放在头文件的情况会不会有问题?
注意头文件规则,避免链接错误:重复定义(multiple defination)