Contents
Overview
工程文件组织
c++文件后缀名
- 源文件可以是.cpp or .cc,Google code style 推荐使用的是 .cc,但是好像大家学习使用的都是.cpp.
c++源文件后缀- 头文件: 很多人认为头文件就是.h,其实要更复杂一些。如果你用的是纯c++,对很多编译器来讲其实无所谓你用什么后缀,都能识别为c++代码; 但是如果你c和c++混编,就需要区分(c++ 用hpp、h++ etc. ),如果都用.h, 类似
#ifdef CPP
extern "c" {
#endif
#include "xxx.h" /*The c header file*/
#ifdef CPP
}
#endif
- c&cpp混编有很多坑,小心!
- .h还是.hpp
.hpp/.hh/.H/.hxx/.h++ 是 C++ 的头文件, .h 不是, 只不过是习惯成自然。
to be classified
- 三种实现方法的比较(initializer_list标准库类型;<stdarg.h> in C;C++泛型可变参数模板)
以上提到的三种方法都可以实现变参函数。但三种方法都有其各自的有点和局限性,在选择时可以从以下几个方面考虑:
1. 若非必要,不要使用可变参数函数。应该首先考虑函数重载等其他方法。
2. 除非需要兼容C语言编译器,否则不要使用可变参数宏。应为这种方法最不安全;尤其是当参数为对象时这种方法易产生各种问题。毕竟这些宏是为C语言设计的,C语言中没有对象。
3. 如果参数类型相同且C++11可用,则通过声明形参为initializer_list往往是最简单、最有效的办法
4. 变参模板看似最为强大。参数的类型可以不同、比可变参数宏更加安全并且可以自动推断参数类型和参数个数。但考虑到模板会为每一个不同的实例生成代码,如果函数的实例过多可能会使代码体积增大。另外,依靠递归使得功能具有局限性,并且效率也会受到影响。
- hpp file
实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库