C ++语法/语义问题:引用Function和typedef关键字

时间:2011-08-01 23:33:13

标签: 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 };
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, &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]

非常感谢对此事的澄清。

2 个答案:

答案 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, &copy, &search }; 
void (*file_ops[])() = { &open, &append, & close, &write };

void (**button2)() = edit_ops;
void (**button3)() = file_ops;

button2[2]( );   

这就是为什么每个人在使用函数指针时都更喜欢typedef。

阅读时,找到开始阅读的地方。尽可能多地阅读,但请观察()的分组。然后尽可能多地向左读,再次受限于分组()。完成()中的所有内容后,从右侧读取开始,然后向左侧开始。

应用于void (*edit_ops[])(),这意味着

  1. edit_ops是 (向右走)
  2. 一个数组 (点击组的末尾,向左转)
  3. 指针 (分组结束)
  4. 到函数服用 (向右解析())
  5. 没有争论 (转到左边)
  6. 返回空白
  7. 专家: 为了使它更复杂,参数可以有名称(将被忽略),因此甚至可能很难找到从哪里开始解析!例如。 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);