C++_typedef_疑难定义收集整理_C/C++语言_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

C++_typedef_疑难定义收集整理

作者:黑客防线网安C/C++教程基地 来源:黑客防线网安C/C++教程基地 浏览次数:0

本篇关键词:整理收集定义疑难
黑客防线网安网讯:     至今已遇到两个typedef诡异的定义,因此决定下笔记之,以备后用。    【typedef之const指针】    【案例】    typedef string * pstr;    const pstr cpstr;    问上述代码中cpstr是一...
     至今已遇到两个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的区别,以防这些细微的陷阱,为高质量代码做好保障。
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-15092-1.html
网站维护教程更新时间:2012-04-04 22:49:46  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer