typedef int (&rifii) (int, int)
会用于什么?
此“声明”之前的typedef是什么? 我想把它想象成
typedef (int (&rifii) (int, int)) [new name]
但[新名称]并不像你做的那样
typedef int INTEGER;
以下语法的类似问题:
typedef void (*PF) ();
PF edit_ops[ ] = { &cut, &paste, ©, &search };
PF file_ops[ ] = { &open, &append, & close, &write };
PF* button2 = edit_ops;
PF* button3 = file_ops;
button2[2]( );
typedef允许什么?它是否正在制作,因此您无需键入:
void (*PF) ();
(void (*PF) ()) edit_ops[ ] = { &cut, &paste, ©, &search };
(void (*PF) ()) file_ops[ ] = { &open, &append, & close, &write };
(void (*PF) ())* button2 = edit_ops;
(void (*PF) ())* button3 = file_ops;
如果是这样,那么typedef的第二部分([你想要的])会发生什么:
typedef [what you have -- (FP)] [what you want]
非常感谢对此事的澄清。
答案 0 :(得分:17)
Typedef不像typedef [type] [new name]
那样有效。 [new name]
部分并不总是在最后。
你应该这样看:如果[some declaration]
声明一个变量,typedef [same declaration]
将定义一个类型。
E.g:
int x;
声明一个名为x的类型为int的变量 - > typedef int x;
将类型x定义为int。struct { char c; } s;
定义一个名为s的某个结构类型的变量 - > typedef struct { char c; } s;
将类型s定义为某种结构类型。int *p;
声明一个名为p的变量,指向int的类型指针 - >
typedef int *p;
将类型p定义为指向int。还有:
int A[];
声明一组名为A - >的整数typedef int A[];
将类型A声明为整数数组。int f();
声明一个名为f - >的函数typedef int f();
声明函数类型为f,返回int并且不带参数。int g(int);
声明函数名称g - > typedef int g(int);
声明函数类型g为返回int并取一个int。暂且不说:请注意,所有函数参数都在新名称后面!由于这些类型也很复杂,[新名称]之后可能会有很多文字。可悲的是,但确实如此。
但那些不是正确的函数指针,只是函数类型。我不确定C或C ++中是否存在函数类型,但它在我的解释中作为中间步骤很有用。
要创建一个真正的函数指针,我们必须在名称中添加“*”。可悲的是,这有错误的优先权:
typedef int *pf();
声明函数类型为pf,返回 int * 。哎呀,这不是我想要的。所以use()分组:
typedef int (*pf)();
声明函数指针类型为pf,返回int并且不带参数。typedef int (&rf)();
声明函数引用类型rf为返回int且不带参数。现在让我们看看你的例子并回答你的问题:
typedef int (&rifii) (int, int);
声明函数引用类型rifii为返回int并获取两个int参数。
显然(?)button2[2]( );
会调用copy();
。
没有typedef的正确语法很难在没有编译器的情况下正确编写,即使使用编译器也难以阅读:
void (*edit_ops[])() = { &cut, &paste, ©, &search };
void (*file_ops[])() = { &open, &append, & close, &write };
void (**button2)() = edit_ops;
void (**button3)() = file_ops;
button2[2]( );
这就是为什么每个人在使用函数指针时都更喜欢typedef。
阅读时,找到开始阅读的地方。尽可能多地阅读,但请观察()的分组。然后尽可能多地向左读,再次受限于分组()。完成()中的所有内容后,从右侧读取开始,然后向左侧开始。
应用于void (*edit_ops[])()
,这意味着
专家:
为了使它更复杂,参数可以有名称(将被忽略),因此甚至可能很难找到从哪里开始解析!例如。 typedef int (*fp)(int x);
有效且与typedef int (*fp)(int);
相同名称甚至可以包含()typedef int (*fp)(int (x));
但是正如我们所见,参数名称可以省略,所以即使允许以下内容: typedef int (*fp)(int ());
。这仍然是一个函数指针,它采用单个int并返回一个int。如果你想让你的代码真的难以阅读......
答案 1 :(得分:-1)
编辑:抱歉,第一个回答没有初始化fcn ptr。
typedef int(& rifii)(int,int)允许您声明通过引用返回int的函数指针,并将两个整数作为参数。
rifi x,y,z;
int &ret_an_int_ref( int p1, int p2 ) {
static int retval=0;
if( p1 > p2 ) retval = p1*p2;
return retval;
}
x = ret_an_int_ref;
y = ret_an_int_ref;
int & an_int_ref = x(1,2);
int & another_int_ref=y(3,4);
z = x;
z(1,2); // will give the same answer as x(1,2);