c++ c pointers function-pointers declaration

c++ - ¿Es void*function() un puntero a la función o una función que devuelve un void*?



pointers function-pointers (4)

Estoy confundido sobre el significado de void *function() .
¿Es un puntero para funcionar o una función que devuelve void* ? Siempre lo he usado en estructuras de datos como una función recursiva que devuelve un puntero, pero cuando vi un código en subprocesos pthread ( pthread ) hay una misma declaración de función. Ahora estoy confundido cuál es la diferencia entre ellos.


Es una función que devuelve un puntero al void .

Piensa en tu declaración de esta manera:

void *(function());

Esta sería una función que devuelve void (o nada):

void (*function2)();

Piense en la declaración anterior de esta manera:

void ((*function2)());

Una forma mucho más fácil de escribir esto es usar typedef s:

typedef void *function_returning_void_pointer(); typedef void function_returning_nothing(); function_returning_void_pointer function; function_returning_nothing *function2;

Esto generalmente elimina la confusión en torno a los punteros de función y es mucho más fácil de leer.


La función tiene el tipo de retorno void * .

void *function();

Así que siempre prefiero en tales casos separar el símbolo * del nombre de la función como

void * function();

Y como Jarod42 señaló en un comentario, puede volver a escribir la declaración de función en C ++ usando el tipo de retorno final como

auto function() -> void *;

Si desea declarar un puntero para que funcione, debe escribir

void ( *function )();

O

void * ( *function )();

O un puntero a la función que devuelve el puntero a la función

void * ( *( *function )() )();


Las declaraciones en C / C ++ se leen desde el identificador hacia afuera siguiendo la precedencia del operador .

Una mirada rápida a la tabla de precedencia de operadores C / C ++ en wikipedia revela que la función llamada operador () tiene una precedencia más alta que el operador de indirección * . Entonces, sus declaraciones de función se leen así:

  • Comience en el identificador: la function es

  • function() una función que no toma argumentos

  • void* function() y devuelve un void* .

Este principio general también es válido para las declaraciones de matriz ( [] también tiene mayor prioridad que * ) y las combinaciones de las dos. Entonces

int *(*arr[42])();

se lee como

  • arr es
  • arr[42] una matriz de 42 elementos que son
  • *arr[42] apunta a
  • (*arr[42])() funciones que no toman argumentos y
  • int *(*arr[42])() devuelve un int* .

Se necesita un poco para acostumbrarse a esto, pero una vez que haya entendido el principio, es fácil leer esas declaraciones sin ambigüedades.


Siempre que no estoy seguro acerca de los problemas de sintaxis de C, me gusta usar la utilidad cdecl ( versión en línea ) para interpretar por mí. Se traduce entre la sintaxis de C y el inglés.

Por ejemplo, ingresé su ejemplo de void *foo() y devolvió

declarar foo como función que devuelve el puntero al vacío

Para ver cómo se vería la otra sintaxis, ingresé declare foo as pointer to function returning void y regresó

nulo (* foo) ()

Esto se vuelve particularmente útil cuando tiene múltiples niveles de tipos de letra, estrellas o corchetes en una sola expresión.