这个文档主要用于记录复习C++时记录的复习笔记

1.STL用法汇总

2.模板

#if, #if defined, #ifdef

条件编译是C语言中预处理部分的内容,是编译器编译代码时最先处理的部分。
条件编译中的判断语句有 #if, #else, #elif, 和#endif。
与if语句不同的是,如果#if后的宏条件符合,编译器就编译之后的代码,否则,编译器就忽略之后的代码不编译。

#if的使用

#if后接表达式

1
2
3
#if (MAX == 10)
code...
#endif

如果 (MAX==10) 成立,则编译器会编译其中的 code… 部分。

#if defined的使用

#if后接一个宏定义

1
2
3
#if defined(x)
code...
#endif

这里的 #if defined 是判断这个程序之前的宏定义中有没有定义这个宏,如果定义了x这个宏,那么会编译器会编译其中的 code… 代码,否则,会直接忽视。
此外,还可以取反,#if !defined(x)

#ifdef的使用

#ifdef的用法与#if defined()的用法相同
#ifndef的用法与#if !defined()的用法相同

C++ typedef的用法

1.定义数据类型的别名

1
2
3
4
5
6
7
8
9
//定义两个指针变量
char* pa;
char* pb;
//利用typedef定义char*的别名
typedef char* PCHAR;
PCHAR pa, pb;

char *pa, *pb;
//虽然这样声明也可行,但是在打的项目中,typedef的形式更方便

2.方便结构体的声明、

在就旧的C代码中,结构体的声明和对象的声明如下

1
2
3
4
5
struct tagPOINT{
int x;
int y;
};
struct tagPOINT p1;

在C++中利用typedef,可以将其写法简化为

1
2
3
4
5
typedef struct tagPOINT{
int x;
int y;
}POINT;
POINT p1;

虽然这种用法在C++不一定常见,但理解它对于旧代码的阅读有帮助

3.定义与平台无关的类型

比如定义一个叫REAL的浮点类型,在目标平台1上,其最高精度的类型为:
typedef long double REAL
在不支持long double的平台2上,改为
typedef double REAL
在不支持double的平台3上,改为
type float REAL
在跨平台时,只需要修改typedef本身就行,不需要对其他源码做任何修改 。
C++标准库就用了这个技巧,虽然宏定义也可以实现,但是typedef不是字符串替换,所以更稳健。

4.为复杂的声明定义一个新的简单的别名

原声明:int*(*a[5])(int, char*)
变量名为a,直接用一个新的别名pFun替换a
typedef int*(*pFun)(int, char*)
原声明的简化版
pFUn a[5]

注意点

typedef是定义了一种数据类型的新别名,不同于宏,它不是简单地字符串替换。例如
先定义,
typedef char* PSTR;
然后,
int mystrcmp(const PSTR);
注意,此时const PSTR实际相当于char const,而并非const char
原因在于const给予了整个指针本身以常量性,也就形成了指针常量char const*