Pregunta

Tengo una declaración typedef raro en un programa en C ++, generada por Py ++.

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

Lo que me di cuenta hasta ahora es que la statemnt typedef anterior no es del tipo, la mayoría de nosotros estamos familiarizados con,

typedef complex_type simple_alias;

Más bien es una forma de declarar puntero a una función que toma como argumento int y devuelve doble (igual que el prototipo). Así que mi pregunta ahora es que, ¿cómo es puntero a una función (sin eliminación de referencias) ser llamada con la dirección de una función como un argumento? Esto también no coincide con el prototipo. Alguien por favor explique!

¿Fue útil?

Solución

Su pregunta es confusa. ¿Estás preguntando lo que hace esto:

radius_function_type(&radius)"

Esto es sólo un encasillado C ++, un poco como:

radius (int (42));

pero desde radio ya es de tipo radius_function_type entonces se puede hacer con la misma facilidad:

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

pero ya que este código es generado por Py ++, es probablemente ser muy cuidadoso con la salida.

Otros consejos

no declara una variable de puntero de función, sino un puntero de función typedef llamado radius_function_type. radius_function_type(&radius) es sólo una (redundante) fundido para el propio puntero de función. (El & unario operador de dirección también es redundante;. Para una función, radius y &radius son la misma cosa)

En un nivel bajo, llamando a una función es simplemente colocando los argumentos en algún lugar de acuerdo con la convención de llamada subyacente (por lo general en la pila) y luego saltar a una dirección de memoria. Por lo que el compilador puede llamar a una función con sólo un puntero si se conoce el tipo de puntero de función (función de firma) y el valor del puntero en sí.

Bueno ... Es un poco similar a la forma en matrices están relacionados con punteros, en C y C ++. El nombre de una función es básicamente un puntero, también. Visto desde ese punto de vista, no es demasiado sorprendente que, dada una definición:

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

Usted puede hacer la llamada, ya sea directamente, a través del puntero que es el nombre de la función:

foo(1, 2);

o mediante el almacenamiento de dicho valor en una variable independiente, que debe ser declarado como un puntero:

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

En este caso, se puede llamar a través de la variable de puntero directamente, y no hay tampoco necesidad de forma explícita "tomar la dirección de" la función escribiendo &foo.

eliminación de referencias (en la forma de pensar) Puntero de una función significa:. Acceder a una memoria de código, ya que sería una memoria de datos

puntero de función no se supone que debe ser dereferenced de esa manera. En su lugar, se llama.

Me gustaría utilizar un nombre de "eliminar la referencia" al lado de "llamada". Está bien.

De todos modos: C está diseñado de tal manera que tanto el identificador de nombre de la función, así como puntero de la función de mantenimiento variable significan lo mismo: la dirección de memoria de código. Y permite saltar a la memoria mediante el uso de la llamada () sintaxis ya sea en un identificador o variable.

puntero de función es básicamente la dirección de la función que debe ser invocado. Para llamar a la función a la que apunta un puntero de función, se tiene en cuenta la función de puntero como si fuera el nombre de la función que se desea llamar. El hecho de llamar él mismo realiza la desreferenciar; no hay necesidad de eliminar la referencia explícita.

sintaxis de puntero de función puede verse como punteros (con y y *), o que puede ser omitido también. Como @unwind ya señaló que es similar a cómo se tratan las matrices donde desnuda matriz es similar a la del puntero y, opcionalmente, se puede prefijar la matriz con y para obtener la dirección.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top