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.

Author: SingleNegationElimination, 2010-10-21

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.

 43
Author: Jonathan Leffler,
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.

 4
Author: Jim Brissom,
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.

 4
Author: Oliver Charlesworth,
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...

 3
Author: Pablo Santa Cruz,
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.

 0
Author: Krishna Kanth Yenumula,
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