• 看书小记6(《C专家编程》)


     typedef不常见但值得一提的用途:

    1. 用typedef来定义与平台无关的类型。


    比方定义一个叫 REAL 的浮点类型。在目标平台一上。让它表示最高精度的类型为:
    typedef long double REAL; 
    在不支持 long double 的平台二上,改为:
    typedef double REAL; 
    在连 double 都不支持的平台三上,改为:
    typedef float REAL; 
    也就是说,当跨平台时,仅仅要改下 typedef 本身即可,不用对其它源代码做不论什么改动。


    标准库就广泛使用了这个技巧。比方size_t。
    另外,由于typedef是定义了一种类型的新别名。不是简单的字符串替换。


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

    方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环。把带变量名的部分留到最后替换。得到的就是原声明的最简化版。

    举例:

    (1). 原声明:int *(*a[5])(int, char*);
    变量名为a,直接用一个新别名pFun替换a就能够了:
    typedef int *(*pFun)(int, char*); 
    原声明的最简化版:
    pFun a[5];

    (2). 原声明:void (*b[10]) (void (*)());
    变量名为b。先替换右边部分括号中的,pFunParam为别名一:
    typedef void (*pFunParam)();
    再替换左边的变量b,pFunx为别名二:
    typedef void (*pFunx)(pFunParam);
    原声明的最简化版:
    pFunx b[10];

    (3). 原声明:doube(*)() (*e)[9]; 
    变量名为e,先替换左边部分。pFuny为别名一:
    typedef double(*pFuny)();
    再替换右边的变量e。pFunParamy为别名二
    typedef pFuny (*pFunParamy)[9];
    原声明的最简化版:
    pFunParamy e;

    理解复杂声明举例:
    int (*func)(int *p);
    func是一个函数指针,这类函数具有int*类型的形參,返回值类型是int。
    int (*func[5])(int *);
    func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*。说明func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符优先级比*高。func先跟[]结合)。跳出这个括号。看右边,又遇到圆括号,说明func数组的元素是函数指针,它指向的函数具有int*类型的形參。返回值类型为int。

    记住2个模式:
    type (*)(....)-->函数指针 
    type (*)[]    -->数组指针 


    其它:

    1. typedef char * pStr;

    char string[4] = "abc";

    const char *p1 = string;

    const pStr p2 = string;

    p1++;

    //p2++;

    p2++编译出错。

    typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和const long x本质上没有差别,都是对变量进行仅仅读限制,仅仅只是此处变量p2的数据类型是我们自定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数据类型为char *的变量p2为仅仅读,因此p2++错误。

    依照顺序。‘const pstr’被解释为‘char * const’(一个指向 char 的常量指针),而不是‘const char *’(指向常量 char 的指针)。这个问题非常easy解决:

    typedef const char * cpstr; int mystrcmp(cpstr, cpstr); // 如今是正确的

    记住:无论什么时候。仅仅要为指针声明 typedef,那么都要在终于的 typedef 名称中加一个 const,以使得该指针本身是常量,而不是对象。


    2. typedef 和存储类keyword

      typedef 就像 auto,extern,mutable。static,和 register 一样,是一个存储类keyword。这并非说 typedef 会真正影响对象的存储特性,仅仅是在语句构成上,typedef 声明看起来象 static,extern 等类型的变量声明。以下将带到第二个陷阱:

    typedef register int FAST_COUNTER; // 错误

    编译通只是。问题出在你不能在声明中有多个存储类keyword。由于符号 typedef 已经占领了存储类keyword的位置。在 typedef 声明中不能用 register(或不论什么其它存储类keyword)。


    參考链接:http://www.ourlove520.com/Programming/vc/201404/242796.html

  • 相关阅读:
    转: 尽己力,无愧于心 存储过程
    转: 尽己力,无愧于心 FastReport.Net 常用功能总汇
    关于Ansi_Nulls、Quoted_Identifier、Ansi_Padding的用法
    数学建模
    数学建模
    深度学习
    C#复习
    Keras的两种网络模型
    xaml转义
    C# 文件目录操作
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/5096893.html
Copyright © 2020-2023  润新知