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
Jarod42señ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 ++). :)typedefestá ... ;-)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 voidy 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
typedefs: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:
functionesfunction()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
arresarr[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