Maison  >  Article  >  développement back-end  >  Comment imprimer un pointeur de fonction en C sans l’invoquer ?

Comment imprimer un pointeur de fonction en C sans l’invoquer ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-25 07:33:29913parcourir

How to Print a Function Pointer in C   Without Invoking It?

Impression d'un pointeur de fonction sans invocation

Lorsque vous essayez d'imprimer une fonction sans parenthèses (c'est-à-dire comme f au lieu de f()), on peut rencontrer des résultats inattendus comme toujours imprimer la valeur 1. Ce comportement apparemment paradoxal découle du mécanisme sous-jacent impliqué.

Dans le code fourni, l'instruction cout << pr; n'invoque pas réellement la fonction pr. Au lieu de cela, il passe le pointeur de fonction pr à cout. C interprète implicitement ce pointeur comme une valeur booléenne, avec un pointeur non nul évalué comme vrai et donc imprimé comme 1.

Pour imprimer le pointeur de fonction lui-même, il faut le convertir explicitement en un pointeur void* . Ceci peut être réalisé en utilisant des expressions telles que cout << (void*)pr.

C 11 et surcharge des pointeurs de fonction

Avec l'avènement de C 11, une méthode plus pratique pour imprimer des pointeurs de fonction est apparue. Surcharge du << L'opérateur pour les pointeurs de fonction permet une sortie plus informative. Par exemple, on peut définir une surcharge qui imprime l'adresse et l'arité de la fonction (nombre d'arguments) :

<code class="cpp">template <class RType, class ... ArgTypes>
std::ostream &amp; operator<<(std::ostream &amp; s, RType(*func)(ArgTypes...))
{
    return s << "(func_ptr=" << (void*)func << ")(num_args=" 
              << sizeof...(ArgTypes) << ")";
}

Cette surcharge imprimera la sortie au format (func_ptr=

) (num_args=< ;arity>).
En employant cette surcharge, on peut obtenir des informations plus détaillées sur un pointeur de fonction lors de son impression à l'aide de cout.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn