C++ C++;语法/语义问题:对函数和typedef关键字的引用
C++ C++;语法/语义问题:对函数和typedef关键字的引用,c++,reference,function-pointers,typedef,C++,Reference,Function Pointers,Typedef,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 };
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]( );
什么是类型定义?它是否使您不必键入:
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]
非常感谢您对此事的澄清。编辑:抱歉,第一个答案没有初始化fcn ptr typedefint(&rifii)(int,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);
Typedef的工作方式与
Typedef[type][new name]
不同。[新名称]
部分并不总是在末尾
您应该这样看:如果[some declaration]
声明了一个变量,typedef[same declaration]
将定义一个类型
例如:
声明一个名为x的变量,类型为int->intx
typedefint x代码> 将类型x定义为int
定义一个名为s的变量,该变量的结构类型为->struct{charc;}s
typedef struct{char c;}s代码>将类型s定义为某种结构类型
int*p代码>声明一个名为p的变量,类型为指向int->
typedef int*p代码>将类型p定义为指向int的指针
声明一个名为A->inta[]
typedef int A[]的int数组代码>将类型a声明为整数数组
声明一个名为f->intf()
typedef int f()的函数代码>将函数类型f声明为返回int且不带参数
声明函数名g->intg(int)
将函数类型g声明为返回一个int并获取一个inttypedefint g(int)
将函数类型pf声明为返回aint*。哎呀,这不是我们想要的typedef int*pf()
将函数指针类型pf声明为返回int且不带任何参数typedef int(*pf)()
将函数引用类型rf声明为返回int且不带任何参数typedefint(&rf)()
typedef int(&rifii)(int,int)代码>将函数引用类型rifii声明为返回一个int并接受两个int参数
显然(?)代码>按钮2[2]()代码>将调用copy()代码>
没有typedefs的正确语法在没有编译器的情况下很难正确编写,即使使用编译器也很难阅读:
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)相同代码>名称周围甚至可以有():typedefint(*fp)(int(x))代码>但是正如我们所看到的,参数名可以省略,因此甚至可以使用以下内容:typedefint(*fp)(int())代码>。这仍然是一个函数指针,只取一个int并返回一个int。如果您想让代码变得很难阅读…问题的一个可能的副本是类似的,我在发布之前查看了相关主题,然而,我的问题很具体,我无法从其他帖子中推断出答案。所以里菲现在是一种类型了?变量x,y,z就是这种类型的?根据比亚恩的说法,从函数返回引用是一种罪恶,所以我假设我永远也看不到这一点?我不能百分之百肯定地说,如果rifi是一种“类型”,希望大师能插话。它的行为就像一个类型,可以像一个类型一样传递,并且可能用作模板参数。您很可能永远看不到这一点,但是对于复杂的数据类型,有时最好按ref返回。运算符=应始终按ref返回,以便像A=A这样的哑语句不会导致seg错误。函数不返回对int的引用,但它是对返回A(普通)的函数的引用你的版本应该是typedefint&(rifii)(int,int)代码>面向对象,很抱歉发布了错误信息:(您的解释很有帮助。为了澄清:typedef void(*PF)()声明了一个类型(*PF),该类型被定义为一个函数指针,它接受0个参数,但不返回任何内容。因此,现在我们有了一个类型PF,如果我们可以在表达式(我可能指语句)中使用它,例如PF edit_ops