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 unvoid*
.
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 unint*
.
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.