gpt4 book ai didi

c++ - 如何理解使用 typedef 定义函数指针?

转载 作者:行者123 更新时间:2023-12-05 08:46:47 24 4
gpt4 key购买 nike

我认为通常 typedef 可以这样使用:

typedef int INT

第一个词是C/C++中的某个关键字,第二个词是第一个词的别名。

但是最近我注意到了这个说法

typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
GLuint buffer;
glGenBuffers(1, &buffer);

typedef后面好像是三个字,编译器怎么解析这个语句呢?

谢谢!

最佳答案

让我们从一般的声明语法开始(我将使用 C 术语,尽管 C++ 大体相似)。在 C 和 C++ 中,声明包含一个或多个声明说明符的序列,后跟以逗号分隔的零个或多个声明符列表。

Declaration specifiers include type specifiers ( int , double , char , unsigned , etc.), type qualifiers ( const , volatile , etc.), storage class specifiers ( static , register , typedef , etc.), struct and union specifiers ,以及其他一些我们不会在这里讨论的事情。

声明符包括被声明事物的名称,以及关于该事物的指针性、数组性或函数性(在 C++ 中您还具有引用性)的信息。

当你声明一个函数时,比如

void foo( int, double );

void是声明符(type specifier),foo( int, double )是declarator。 foo 的类型完全由声明说明符和声明符的组合指定:

     foo                     -- foo
foo( ) -- is a function taking
foo( ) -- unnamed parameter
foo( int ) -- is an int
foo( int, ) -- unnamed parameter
foo( int, double ) -- is a double
void foo( int, double ) -- returning void

用简单的英语来说,foo 的类型是“接受 intdouble 参数并返回 void 的函数。”

您也可以声明指向函数的指针:

       fptr                  -- fptr
(*fptr) -- is a pointer to
(*fptr)( ) -- function taking
(*fptr)( ) -- unnamed parameter
(*fptr)( int ) -- is an int
(*fptr)( int, ) -- unnamed parameter
(*fptr)( int, double ) -- is a double
void (*fptr)( int, double ) -- returning void

同样,唯一的声明说明符是 void ,声明符是 (*fptr)( int, double )

出于句法目的,typedef 与存储类说明符( staticautoregister )组合在一起,但它的行为不像其他存储类说明符 - 它不会影响所声明事物的存储或可见性,而是使声明符中的标识符类型的别名。如果我们把 typedef 贴在上面声明的前面:

typedef void (*fptr)( int, double );

然后它读作

               fptr                   -- fptr
typedef fptr -- IS AN ALIAS FOR THE TYPE
typedef (*fptr) -- pointer to
typedef (*fptr)( ) -- function taking
typedef (*fptr)( ) -- unnamed parameter
typedef (*fptr)( int ) -- is an int
typedef (*fptr)( int, ) -- unnamed parameter
typedef (*fptr)( int, double ) -- is a double
typedef void (*fptr)( int, double ) -- returning void

IOW,fptr 是类型“采用 typedefint 参数并返回 double 的函数指针”类型的别名(void 名称),您可以使用它来声明该类型的指针对象:

fptr fp1, fp2;

你可以对其他指针类型做同样的事情1:

typedef int *intp;         // intp is an alias for the type "pointer to int";
typedef double (*arr)[10]; // arr is an alias for the type "pointer to 10-element array of double"

声明符可能会变得非常复杂。您可以拥有指向函数的指针:

T (*ptr)();

指向数组的指针:

T (*ptr)[N];

函数指针数组:

T (*ptr[N])();

返回数组指针的函数:

T (*foo())[N];

指向返回数组指针的函数的指针数组:

T (*(*arr[N])())[M];

等等,将 typedef 放在其中任何一个前面都可以:

typedef T (*(*arr[N])())[M];

表示 arr 是类型“指向函数的指针的 N​​ 元素数组返回指向 T 的 M 元素数组的指针”类型的别名。


<支持>
  1. 通常,您不想将指向标量类型的指针隐藏在 typedef 后面,除非您可以保证使用该类型的程序员永远不必知道该类型的底层指针性(即,永远不会知道用 * 明确取消引用它或尝试用 %p 或类似的东西打印它的值)。

关于c++ - 如何理解使用 typedef 定义函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69047157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com