typedef 工具用于为类型创建别名。例如,
typedef int *iptr;
创建名称 iptr 作为类型 int * 的同义词,因此您可以使用声明指针
iptr p, q;
而不是写
int *p, *q;
C 声明语法比大多数人意识到的要复杂一些,尤其是在涉及指针的地方。基本规则是:
T *p; // p is a pointer to T
T *a[N]; // a is an array of pointer to T
T *f(); // f is a function returning pointer to T
T (*a)[N]; // a is a pointer to an array of T
T (*f)(); // f is a pointer to a function returning T
T const *p; // p is a pointer to const T
const T *p; // same as above
T * const p; // p is a const pointer to T
事情可以变得任意复杂——你可以拥有指向函数的指针数组:
T (*a[N])();
或返回数组指针的函数:
T (*f())[N];
甚至更严重的暴行。当混合有参数时,函数指针声明会变得更加丑陋;幸运的是,您只需要在声明中列出参数 types,而不是名称:
typedef Value (*NativeFn)(int, Value*);
让事情变得一点更容易理解。
该声明创建了NativeFn 作为类型“指向采用int 和Value * 并返回Value 的函数的指针”的同义词。
假设你有一个定义为的函数
Value foo( int argcCount, Value *args )
{
Value result;
...
return result;
}
如果你想创建一个指向这个名为fptr的函数的指针,你通常会将它声明为
Value (*fptr)(int, Value *) = foo;
但是,上面的typedef 声明允许您编写
NativeFn fptr = foo;
说了这么多,使用typedef 谨慎。问题在于,虽然它可以创建一种更易于阅读的方式来声明某些项目,但它也隐藏了一些潜在有用的信息。例如,尽管上面有 iptr 示例,但最好不隐藏 typedef 后面的指针 - 如果有人需要在 p 或 q 上使用一元 * 运算符以便使用它们是正确的,而不是这些信息需要在这些项目的声明中。如果有人需要调用 fptr 指向的东西,那么他们需要知道返回类型是什么、参数的数量和类型等,但是所有这些信息都在使用 typedef 名称的声明。