除此之外,还可以使用NDEBUG来编写一些根据NDEBUG的值判断是否执行的代码:
#ifndef NDEBUG#endif
如果NDEBUG没有定义,则上面块中的代码将被执行。
C++预处理器提供了一些用于调试的变量:
__func__ 当前函数
__FILE__ 当前文件
__LINE__ 当前行
DATE 编译日期
TIME 编译时间
重载函数重载的选择:所有数学转换优先级都是相等的,如:
void test(float f);void test(long l);
//调用test(1)时会出现ambiguous
C++中不能将const类型的引用赋值给普通类型的引用(暂时可以助记为初始化常量引用时的限制没有普通引用多)
函数指针
定义类型: bool (*pf)(const string&)
可以直接使用函数指针来调用函数,而不需要进行解引用:
bool (*pf)(const string&);pf("hello");
(*pf)("hello");
给函数指针赋值时,需要返回值类型和参数类型完全一致才可以赋值,函数指针之间不存在指针的转换
函数指针指向重载函数时,需要指定具体使用的函数,通过确定的变量
函数指针作为参数,可以直接使用函数作为参数,该函数实际上会作为一个指针来处理:
void test(bool pf(const string&));void test(bool (*pf)(const string&));
或者,也可以使用typedef和decltype来简化代码:
//Func和Func2是函数类型typedef bool Func(const string&);
typedef decltype(test) Func2;
//Funcp和Funcp2是函数指针类型
typedef bool(*Funcp)(const string&);
typedef decltype(test) *Funcp2;
返回指针类型
//声明函数指针
using F = int(int*); // F是一个函数类型,而不是一个函数指针
using PF = int(*)(int*); // PF是函数指针
//定义函数指针
PF f1(int);
F *f1(int);
//上面的定义等于:
int (*f1(int))(int*);
//可以使用auto和decltype
auto f1(int) -> int(*)(int*)