Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

329
Vistas
¿Dar nombres a los argumentos en los punteros de función?

Digamos que tiene una firma de función bastante complicada, como esta:

 void **search( char *inSearch, int inNumToSkip, int inNumToGet, int *outNumResults, int *outNumRemaining );

Digamos que desea escribir otra función que acepte punteros a funciones que coincidan con esta firma de "búsqueda". En los ejemplos, normalmente veo tales funciones escritas así:

 void *getFirstResult( char *inSearch, void ** (inSearchFunc*)( char *, int, int, int*, int* ) );

Supongamos que esta función realiza la búsqueda utilizando la función pasada y devuelve solo el primer resultado, destruyendo limpiamente el resto, o lo que sea.

Ahora, mirando getFirstResult y tratando de escribir una función para pasarle, es totalmente no autodocumentado, porque no hay información sobre los parámetros "inSearchFunc" incluidos en esa definición. Sabes que es una función de búsqueda de algún tipo que se está pasando, pero nada más.

Tenga en cuenta que ese mismo formato (tipos de parámetros sin nombres) es válido como prototipo de función en un encabezado o declaración directa, por lo que los nombres de los argumentos son siempre opcionales, incluso en la implementación de la función real (donde claramente se necesitan para usar los argumentos en el cuerpo de la función, pero sigue siendo opcional).

No puedo encontrarlo documentado o mencionado en ninguna parte, pero esto se compila y funciona bien:

 void *getFirstResult( char *inSearch, void ** (inSearchFunc*)( char *inSearch, int inNumToSkip, int inNumToGet, int *outNumResults, int *outNumRemaining ) );

Obviamente, esto es mucho más claro y autodocumentado.

¿Es este código C legal y seguro? ¿Dónde se documenta este tipo de sintaxis opcional?

Y finalmente, ¿por qué no todos escriben sus argumentos de puntero de función de esta manera para mayor claridad? Especialmente en los ejemplos destinados a explicar los punteros de función a los principiantes, los argumentos sin nombre siempre parecen totalmente opacos y confusos.

De hecho, esta versión súper opaca también es legal:

 void *getFirstResult( char *, void ** (*)( char *, int, int, int*, int* ) );

Claramente, todos al menos le darían al char * y al (*) un nombre para mayor claridad, entonces, ¿por qué no darle un nombre a todo?

En mi antiguo y venerable C++ Primer , dice:

El nombre del parámetro no es necesario en una declaración de función. Si está presente, su nombre debe servir como ayuda para la documentación.

y luego

No hay penalización impuesta por el lenguaje por especificar un nombre diferente para un parámetro en la(s) declaración(es) y definición de la misma función. Sin embargo, un lector del programa puede confundirse.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Puede usar un typedef para que esto sea más fácil de leer y obtener los nombres de las variables donde los desee como ayuda para la documentación:

 typedef void ** (*search_func_t)( char *inSearch, int inNumToSkip, int inNumToGet, int *outNumResults, int *outNumRemaining ); void *getFirstResult( char *inSearch, search_func_t inSearchFunc );
over 4 years ago · Santiago Trujillo Denunciar

0

Bueno... personalmente prefiero nombrar los argumentos también. El único inconveniente real que se me ocurre es que repetirte requiere que cambies ambos cuando cambia.

Más allá de eso... en mi humilde opinión, es más claro

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda