c++ - Qué significa "typedef void(* Something)()"
static-members void-pointers (5)
Define un tipo de puntero a función. Las funciones devuelven nulo, y la lista de argumentos no se especifica porque la pregunta es (actualmente, pero posiblemente erróneamente) etiquetada como C; si se etiquetara C ++, entonces la función no tomaría ningún argumento. Para que sea una función que no tome argumentos (en C), usaría:
typedef void (*MCB)(void);
Esta es una de las áreas donde hay una diferencia significativa entre C, que aún no requiere que todas las funciones sean prototipadas antes de ser definidas o utilizadas, y C ++, que sí lo hace.
Estoy tratando de entender lo que esto significa, el código que estoy viendo tiene
en .h
typedef void (*MCB)();
static MCB m_process;
Cª
MCB Modes::m_process = NULL;
Y a veces cuando lo hago
m_process();
Tengo fallas en las segmentaciones, es probable porque la memoria fue liberada, ¿cómo puedo depurar cuando se libera?
Espero que mis preguntas sean claras.
Es un puntero a la función. Obtiene una FALLA DE SEGMENTACIÓN porque está tratando de realizar una llamada a una función cuya dirección no es válida ( NULL
).
De acuerdo con su muestra específica, la función no debe devolver ningún valor ( void
) y no debe recibir ningún parámetro ()
.
Esto debería funcionar:
void a()
{
printf("Hello!");
}
int main(int arcg, char** argv)
{
m_process = a;
m_process(); /* indirect call to "a" function, */
// Hello!
}
Los punteros de función se usan comúnmente para algún tipo de manejo de eventos en C. Sin embargo, no es su único uso ...
Introduce un tipo de puntero a función, apuntando a una función que no devuelve nada (nulo), sin tomar ningún parámetro y nombrando el nuevo tipo MCB .
Tomemos un ejemplo
typedef void (*pt2fn)(int);
Aquí, estamos definiendo un tipo pt2fn. Las variables de este tipo apuntan a funciones, que toman un número entero como argumento y no devuelven ningún valor.
pt2fn kk;
Aquí, kk es una variable de tipo pt2fn, que puede apuntar a cualquier función que tome un entero como entrada y no devuelva ningún valor.
Typedef define MCB
como el tipo de un puntero a una función que no toma argumentos y devuelve void
.
Tenga en cuenta que MCB Modes::m_process = NULL;
es C ++, no C. Además, en C, typedef realmente debería ser typedef void (*MCB)(void);
.
No estoy seguro de lo que quiere decir con "la memoria fue liberada". Usted tiene un puntero estático para una función; una función no puede ser liberada. A lo sumo, su puntero se ha restablecido en algún lugar. Solo depure con un reloj de memoria en m_process
.