Estoy confundido sobre el significado de void *function()
.
¿Es un puntero para funcionar o una función que regresa 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 multithreading ( pthread
) hay una misma declaración de función. Ahora estoy confundido cuál es la diferencia entre ellos.
c++
c
pointers
function-pointers
declaration
usuario9515151
fuente
fuente
void*function();
es sintácticamente correcto. Por ejemplo, para Python eligieron una decisión diferente: el formato es parte de la sintaxis. En mi humilde opinión, ambas formas tienen sus ventajas y desventajas.void *function()
es una función que toma un número arbitrario de argumentos y devuelve un valor que, cuando se desreferencia, es de tipo void . En C ++,void* function()
es una función que no toma argumentos y devuelve un valor de puntero a vacío . Debes decidir en qué idioma estás preguntando.void *
. Después de todo, incluso si pudieras, ¿qué harías con unvoid
?Respuestas:
La función tiene el tipo de retorno
void *
.Así que siempre prefiero en tales casos separar el símbolo
*
del nombre de la función comoY como se
Jarod42
señala en un comentario, puede volver a escribir la declaración de función en C ++ usando el tipo de retorno final comoSi desea declarar un puntero para que funcione, debe escribir
O
O un puntero a la función que devuelve el puntero a la función
fuente
void* function();
. Eso no es tan tentador ... ;-) (La edición ocurrió justo mientras escribía esto.)void * reader();
luego enpthread_create(&thread1,null,reader,reader_arg)
lugar depthread_create(&thread1,null,&reader,reader_arg)
auto function() -> void*
(C ++). :)typedef
está ... ;-)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óPara ver cómo se vería la otra sintaxis, ingresé
declare foo as pointer to function returning void
y regresóEsto se vuelve particularmente útil cuando tiene múltiples niveles de tipos de letra, estrellas o corchetes en una sola expresión.
fuente
Es una función que devuelve un puntero a
void
.Piensa en tu declaración de esta manera:
Esta sería una función que devuelve
void
(o nada):Piense en la declaración anterior de esta manera:
Una forma mucho más fácil de escribir esto es usar
typedef
s:Esto generalmente elimina la confusión en torno a los punteros de función y es mucho más fácil de leer.
fuente
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 el operador de llamada de función
()
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:
function
esfunction()
una función que no toma argumentosvoid* function()
y devuelve avoid*
.Este principio general también se cumple con las declaraciones de matriz (
[]
también tiene mayor prioridad que*
) y las combinaciones de las dos. Entoncesse lee como
arr
esarr[42]
una matriz de 42 elementos que son*arr[42]
punteros a(*arr[42])()
funciones que no toman argumentos yint *(*arr[42])()
devolver 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.
fuente