Qué significa " typedef void (*Something) ()"
Estoy tratando de entender lo que esto significa, el código que estoy mirando tiene
In .h
typedef void (*MCB)();
static MCB m_process;
In .C
MCB Modes::m_process = NULL;
Y a veces cuando lo hago
m_process();
Me falla la segmentación, probablemente porque la memoria se liberó, ¿cómo puedo depurar cuando se libera?
Espero que mis preguntas sean claras.
5 answers
Define un tipo puntero a función. Las funciones devuelven void, y la lista de argumentos no está especificada porque la pregunta está (actualmente, pero posiblemente erróneamente) etiquetada C; si estuviera etiquetada C++, entonces la función no tomaría argumentos en absoluto. Para convertirla en una función que no toma argumentos (en C), usarías:
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 usado, y C++, que lo hace.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-20 21:38:56
Introduce un tipo de puntero de función, apuntando a una función que no devuelve nada (void), no toma ningún parámetro y nombra el nuevo tipo MCB.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-20 21:31:38
El typedef define MCB
como el tipo de 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. También, en C, el typedef debería ser realmente typedef void (*MCB)(void);
.
No estoy seguro de lo que quieres decir con "la memoria fue liberada". Tiene un puntero estático a una función; una función no se puede liberar. A lo sumo, su puntero se ha restablecido en algún lugar. Simplemente depure con un reloj de memoria en m_process
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-20 21:33:17
Es un puntero de función. Obtiene un ERROR de SEGMENTACIÓN porque está tratando de hacer 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 alguna forma de manejo de eventos en C. Sin embargo, no es su único uso...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-20 21:33:37
Tomemos un ejemplo
typedef void (*pt2fn)(int);
Aquí, estamos definiendo un tipo pt2fn. Las variables de este tipo apuntan a funciones, que toman un 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-22 16:58:28