Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

337
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!