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, &copy, &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, &copy, &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, &copy, &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]
将定义一个类型

例如:

  • intx
    声明一个名为x的变量,类型为int->
    typedefint x
    将类型x定义为int
  • struct{charc;}s
    定义一个名为s的变量,该变量的结构类型为->
    typedef struct{char c;}s将类型s定义为某种结构类型
  • int*p声明一个名为p的变量,类型为指向int->
    
    typedef int*p将类型p定义为指向int的指针
而且:

  • inta[]
    声明一个名为A->
    typedef int A[]的int数组将类型a声明为整数数组
  • intf()
    声明一个名为f->
    typedef int f()的函数将函数类型f声明为返回int且不带参数
  • intg(int)
    声明函数名g->
    typedefint g(int)
    将函数类型g声明为返回一个int并获取一个int
旁白:请注意,所有函数参数都位于新名称之后!由于这些类型可能也很复杂,在[新名称]之后可能会有很多文本。遗憾的是,这是真的

但这些都不是合适的函数指针,只是函数类型。我不确定C或C++中是否存在函数类型,但在解释中,它是有用的。 要创建真正的函数指针,必须在名称中添加“*”。不幸的是,它的优先顺序是错误的:

  • typedef int*pf()
    将函数类型pf声明为返回aint*。哎呀,这不是我们想要的
因此,请使用()来分组:

  • typedef int(*pf)()
    将函数指针类型pf声明为返回int且不带任何参数
  • typedefint(&rf)()
    将函数引用类型rf声明为返回int且不带任何参数
现在让我们看一下您的示例并回答您的问题:

typedef int(&rifii)(int,int)将函数引用类型rifii声明为返回一个int并接受两个int参数

显然(?)代码>按钮2[2]()将调用
copy()

没有typedefs的正确语法在没有编译器的情况下很难正确编写,即使使用编译器也很难阅读:

void (*edit_ops[])() = { &cut, &paste, &copy, &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