Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

333
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda