1

我在 Py++ 生成的 C++ 程序中有一个奇怪的 typedef 语句。

double radius(int);  // function to be wrapped
typedef double (*radius_function_type)(int);    
bp::def("radius", radius_function_type(&radius));   // bp::def is a function for wrapping

到目前为止,我发现上面的 typedef 语句不是我们大多数人都熟悉的类型,

typedef complex_type simple_alias;

相反,它是一种声明指向以 int 作为参数并返回 double (与原型相同)的函数的指针的方法。所以我现在的问题是,如何使用函数地址作为参数调用指向函数的指针(没有取消引用) ?这也与原型不匹配。有人请解释!

4

5 回答 5

6

它没有声明一个函数指针变量,而是一个名为 typedef 的函数指针radius_function_typeradius_function_type(&radius)只是函数指针本身的(冗余)强制转换。(一元&地址运算符也是多余的;对于一个函数来说,radius&radius是一样的。)

在低层次上,调用函数只是根据底层调用约定(通常在堆栈上)将参数放置在某处,然后跳转到内存地址。因此,如果编译器知道函数指针类型(函数签名)和指针值本身,则编译器可以仅使用指针调用函数。

于 2009-06-03T12:47:07.647 回答
3

你的问题令人困惑。你问这是做什么的:

radius_function_type(&radius)"

这只是一个 C++ 类型转换,有点像:

radius (int (42));

但由于 radius 已经是 radius_function_type 类型,所以你可以很容易地做到:

bp::def("radius", radius);

但由于这是由 Py++ 生成的代码,因此可能对输出要格外小心。

于 2009-06-03T12:51:39.307 回答
2

嗯......这有点类似于在 C 和 C++ 中数组与指针的关系。函数的名称基本上也是一个指针。从这个角度来看,给定一个定义也就不足为奇了:

int foo(int a, int b)
{
  return a + b;
}

您可以通过作为函数名称的指针直接进行调用:

foo(1, 2);

或者通过将该值存储在一个单独的变量中,该变量必须声明为一个指针:

int (*pointer)(int, int) = foo;
pointer(1, 2);

在这种情况下,我们可以直接通过指针变量调用,也不需要通过写显式地“获取”函数的地址&foo

于 2009-06-03T12:38:49.533 回答
1

取消引用(以您认为的方式)函数的指针意味着:访问 CODE 内存,就像它是 DATA 内存一样。

函数指针不应该以这种方式被取消引用。相反,它被称为。

我会使用名称“取消引用”和“呼叫”。没关系。

无论如何:C 的设计方式使得函数名称标识符和变量保存函数的指针都具有相同的含义:CODE 内存的地址。它允许通过在标识符或变量上使用 call () 语法来跳转到该内存。

于 2009-06-03T12:46:47.227 回答
1

函数指针基本上就是需要调用的函数的地址。要调用函数指针指向的函数,您可以将函数指针视为您希望调用的函数的名称。调用它本身的行为执行取消引用;不需要显式取消引用。

函数指针语法可能看起来像指针(带有 & 和 *)或者也可以省略。正如@unwind已经指出的那样,它类似于如何处理数组,其中裸数组类似于指针,并且您可以选择在数组前面加上 & 来获取地址。

于 2009-06-03T12:55:56.520 回答