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.
- 官方定义初次接触此类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之后,原来是变量的都变成一种类型。不管这个声明中的标识符号出现在中间还是最后.
- 隐藏技能typedef 定义的新类型, 使用时可以省略括号.什么意思?typedef int NUM;
NUM a = 10; // 也可写成`NUM(a) = 10;
NUM(b) = 12; // 也可写成`NUM b = 12;
- 举例
整形 : 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是重命名,可以为枚举结构体等等重新命名,提高代码整洁。