如何理解C/C++中使用typedef定义函数指针的语法规则?
关于typedef定义函数指针的编译器解析逻辑
C/C++ 中 typedef 的语法规则本质和普通变量声明完全一致,仅需将声明中的「变量名」替换为「类型别名」理解即可,不存在特殊的语法结构。
你之前熟悉的常规用法也符合这个逻辑:
- 声明
int a时,a是int类型的变量;在前面加typedef变成typedef int a,a就成为int类型的别名 - 扩展到指针场景:声明
int *p时,p是指向int的指针变量;加typedef变成typedef int *p,p就成为int*类型的别名
函数指针声明的逻辑
首先看普通函数声明:
void func(GLsizei, GLuint*);
上面的代码声明了一个名为func、返回值为void、参数为(GLsizei, GLuint*)的函数。
如果要声明一个指向这类函数的指针变量,需要写为:
void (*pf)(GLsizei, GLuint*);
这里的括号是必须的:因为()的优先级高于*,如果不加括号写为void *pf(...),会被解析为「返回值为void*、名为pf的函数声明」,而不是函数指针。
对应typedef的解析
要给上述函数指针类型定义别名,只需要在这个变量声明前加typedef关键字即可:
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
编译器的解析步骤如下:
- 先忽略
typedef关键字,按普通变量声明规则解析语句:- 找到标识符
GL_GENBUFFERS,它被*修饰,说明是指针类型 - 外层括号包裹
*GL_GENBUFFERS,说明该指针指向后方的()结构,即指向函数 - 函数的参数列表为
(GLsizei, GLuint*),返回值为最前方的void
- 找到标识符
- 因为语句以
typedef开头,所以标识符GL_GENBUFFERS不会被当作变量处理,而是被定义为「指向返回值为void、参数为(GLsizei, GLuint*)的函数的指针」这个类型的别名。
示例代码逻辑验证
你给出的后续代码就能直接用这个别名声明变量:
// 声明一个GL_GENBUFFERS类型的函数指针变量glGenBuffers GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers"); GLuint buffer; // 通过函数指针调用对应函数,和直接调用原生函数语法完全一致 glGenBuffers(1, &buffer);
内容的提问来源于stack exchange,提问作者zjnyly
相关产品推荐
相关产品推荐

