C++_typedef_疑难定义收集整理 |
|
至今已遇到两个typedef诡异的定义, 因此决定下笔记之,以备后用 。 【typedef之const指针】 【案例】 typedef string * pstr; const pstr cpstr; 问上述代码中cpstr是一个 怎么的指针? 【 综合】 众多朋友,包含我自己在刚接触到时,第一 反响是:cpstr被定义为一个指向const string对象的一般指针,缘由很 方便,置换一下string*与pstr的位置就得到 //这显然便是一个指向const string对象的一般指针 const string * cpstr; 但是,事不如人愿,cpstr确实切定义为:一个指向string类型的const指针 。 看到这个答案,相比不少朋友稍显 惊异,我也如此,其中内因,且听我 渐渐道来 。 之所以出错,在于我们“置换一下就好了”,“置换”这个词不应该用在typedef,而该用在#define宏身上,typedef是定义了一个类型别名,定义的 后果遵照任何 畸形定义的 标准 。那么这个typedef到底是怎么定义了一个const指针呢? 首先 综合 const pstr cpstr; 这段代码定义了一个pstr类型的const cpstr,实际上便是 pstr const cpstr; 为了便于 了解,就拿int定义来说 //二者等价,前者是习 惯用法,后者是 标准规定 const int ival = 0; int const ival = 0; 既然 了解了cpstr是一个const的pstr类型的对象,pstr是什么呢?pstr是string*, 因此这样一来,就成了cpstr是一个const的string*类型的对象,也即cpstr是一个指向一般string的const指针 。 【总结】 本次 误会重要源于大家认为typedef等同于#define宏定义, 认为 方便替换字符就 可以了 。实则否则 。以后见到这样的定义,最 方便的 步骤便是从定义该变量的地方 动手 typedef string * pstr; const pstr cpstr; 按步骤(娴熟了就很快了)思量: ①cpstr是一个类型为 pstr 的常量 ②pstr 是什么? ③pstr 是 string* ④所以,cpstr是一个类型为 string* 的常量,也即 string *const cpstr 【typedef之函数类型】 【案例】 typedef int FUNC (int); 请问typedef定义了一个什么类型? 【 综合】 不要 惊异,便是这样,它不是一个函数指针,也不是被我写错了 。 它定义了一个函数类型FUNC,这个函数类型要求一个int形参,返回一个int 后果 。 【总结】 FUNC TestFunc(FUNC F); FUNC的用法是有 制约的,上述语句会招致编译时 舛误 。 上述代码 使用了两次FUNC,出错的是第一个,也便是FUNC类型的函数返回类型是有错的 。 FUNC是函数类型,在另一个函数中,函数类型变量只 可以用作另一个函数的形参,而不能是返回类型 。 FUNC用作形参时,编译器会自动将其转换为FUNC* /*函数指针*/,而编译器不会将作为函数返回类型的FUNC进行转换, 因此会浮现编译时 舛误,可 修改如下 FUNC* TestFunc(FUNC F); 申明了一个函数TestFunc,该函数要求一个函数类型为FUNC的函数F作为形参,并返回一个FUNC类型的函数指针FUNC* 【typedef与#define】 【案例】 typedef int* Tpi; #define int* Dpi; Tpi p1,p2; Dpi p3,p4; 问上述代码中定义的四个变量分别为何类型? 【 综合】 划分p1,p2,p3,p4四个变量的类型,首先要 了解typedef和#define宏的区别,typedef是给已有的类型取别名,而#define只不过 方便的字符替换 。于是上述代码等同于 int *p1,*p2;//typedef的作用 int *p3,p4;//#define的作用 也便是说p3被定义为了一个整型指针,而p4则只不过整型 。 【总结】 需求 主宰typedef与#define的区别,以防这些 细微的陷阱,为高 品质代码做好保障 。 |