typedef笔记

Typedef定义

含义:定义一个指向函数的变量(类型)

eg:typdef void(*PFUNC)(void);

Typedef用法

typedef+数据类型
typedef+函数名
typedef+变量


不太想谈#define, 在题主的例子的这种用法里, 它就是个文本替换工具, 预处理器完成的, 无脑替换, 跟word里的replace一模一样, 不关编译器的事. 我想谈一下typedef.搞懂了c++创始人写的< the design and evolution of cpp>中的下面这个例子, 有助于你理解typdef:1

    typedef int P();
    typedef int Q();
    class X {
        static P(Q); // 等价于`static int Q()`, Q在此作用域中不再是一个类型
        static Q(P); // 等价于`static int Q(int ())`, 定义了一个名为Q的function
    };

这是一个极好的例子, 先问一下 typedef int P()到底做了什么? 其实是:

declares a function type P as returning an int and taking no arguments.

  1. 官方定义初次接触此类typedef用法的程序员直观上理解这个例子比较困难, 我们来看一下typedef的官方定义:

Typedef does not work like typedef [type] [new name]. The [new name] part does not always come at the end. You should look at it this way:
if [some declaration] declares a variable, typedef [same declaration]
would define a type.

看我标黑的这句话, 总结一下就是: 任何声明变量的语句前面加上typedef之后,原来是变量的都变成一种类型。不管这个声明中的标识符号出现在中间还是最后.

  1. 隐藏技能typedef 定义的新类型, 使用时可以省略括号.什么意思?typedef int NUM;
    NUM a = 10; // 也可写成`NUM(a) = 10;
    NUM(b) = 12; // 也可写成`NUM b = 12;
  1. 举例

整形 : typedef int x; // 定义了一个名为x的int类型

结构体: typedef struct { char c; } s; // 定义名为s的struct类型

指针typedef int *p; //定义了一个名为p的指针类型, 它指向int (中文描述指针好累)

接下来是高级的(注意标识符不一定在最后):

数组typedef int A[]; // 定义一个名为A的ints数组的类型
函数typedef int f(); // 定义一个名为f, 参数为空, 返回值为int的函数类型

```typedef int g(int); // 定义一个名为g, 含一个int参数, 返回值为int行的函数类型```

现在回过头看:

    typedef int P();
    static P(Q); 

应该就比较好理解了, P是一个新定义的function类型, 它返回值为int, 无参数根据我的第2点说明, P(Q); 实际上等价于P Q, 声明Q是一个返回值为int, 无参数的函数.这玩意有什么用呢?我们都知道C++语言里, 函数都是先声明后使用的(除非在使用之前定义), 看以下例子:

      #include < iostream>
      #include <stdio.h>
      #include < string >
     
          typedef int P(); // 简单的
          typedef void Q(int *p, const std::string& s1, const std::string& s2, size_t size, bool is_true); // 复杂的
          class X {
          public:
                P(eat_shit); // 等价于声明`int eat_shit();`
                Q(bullshit); // 等价于声明`void bullshit(int *p, const string& s1, const string& s2, size_t size, bool is_true);`
            };
            
       int main() {
            X *xx;
            printf("shit ret: %d\n", xx->eat_shit());
            int a[] = {1, 3, 4, 5, 7};
            xx->bullshit(a, "foo", "bar", sizeof(a)/sizeof(int), true);
        }
        
       int X::eat_shit() {
            return 888;
        }
        
       void X::bullshit(int *p, const std::string& s1, const std::string& s2, size_t size, bool is_true) {
            std::cout << "s1: " << s1 << ", s2: " << s2 << ", size: " << size << std::endl;
            printf("elems:\n");
            for(int i = 0; i < size; i++) {
                printf("%d %s",  *p++, (i == size-1) ? "" : ",");
            }
            printf("\n");
        }

开一下眼!

struct _CMD_TOKEN;
typedef BOOL (*CMDFUNC)(struct _CMD_TOKEN *);
typedef struct _CMD_TOKEN{
	CMDFUNC	cmdFunc;						//指令处理函数
	u8		inIdx;							//输入的数据索引
	u8		outIdx;							//输出的数据索引
	u8		cnt;							//最大能接受的数据,不能大于dat的空间
	u8		dat[TOKEN_DATLEN];				//数据缓冲
}CMD_TOKEN;

巩固练习2

    typedef char* CHARS;
    typedef CHARS const CPTR_1;
    typedef const CHARS CPTR_2;
    typedef char* const CPTR_3;
    typedef const char* CPTR_4;  
    

扩展:typedef与#define区别

#define 没有参加编译,在预处理的时候就被替换掉了。
typedef参加编译和链接。
typedef是重命名,可以为枚举结构体等等重新命名,提高代码整洁。


  1. 作者:[婉儿飞飞] https://www.zhihu.com/question/29798061/answer/144423125) ↩︎

  2. 作者:白如冰 链接:https://www.zhihu.com/question/29798061/answer/46143063 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炒番茄蛋的厨子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值