0
votes

fonction variadique pour fonctionner le pointeur de fonction

Y a-t-il un moyen de lancer une fonction variadique à un pointeur de fonction comme celui-ci, est-ce légal? Je demande à la fois pour C et pour C ++, mais depuis que cette construction existe dans les deux langues, j'ai posé les deux questions en une. XXX

Merci, Thejack


3 commentaires

C ou c ++? Ce sont deux langues différentes.


Désolé, c'était une faute de frappe, je l'ai corrigée


Utilisez des modèles variadiques pour C ++, cela rendra votre fonction un vrai int (int, int, long) .


3 Réponses :


4
votes

Les fonctions variadiques de style C sont leur propre bête spéciale. Leurs arguments doivent être déballés avec la famille VA_LIST Fonctions de fonctions. Il n'y a pas de compatibilité avec les fonctions non variadiques, et ce ne sont pas des macros et non.

Compte tenu de votre utilisation de auto Je suppose que vous posez des questions sur C ++, malgré la double-marquage. Essayez d'éviter les fonctions comme celle de C ++.


0 commentaires

2
votes

Vous êtes libre de lancer un pointeur de fonction sur un pointeur de fonction d'un type différent, mais appelez une fonction via un pointeur de fonction d'un type différent est un comportement indéfini. (Donc, la seule chose valide que vous puissiez faire avec le pointeur de la fonction de distribution consiste à le jeter au type correct RHE.)

Les fonctions variadiques n'ont pas le même type que les fonctions avec un nombre spécifique d'arguments. Donc, le résultat de la distribution ne peut pas être utilisé pour appeler la fonction.

Si vous l'essayez sur un compilateur, vous pourriez constater que cela fait ce que vous attendez. Mais cela ne le rend pas valable; Il peut bien casser sur une plate-forme différente ou une autre version du compilateur.

(ce qui précède est vrai pour C et C ++.)


0 commentaires

0
votes

en C, ces types sont pas forts> compatibles.

Section 6.2.7 du standard concernant" Type compatible et type composite "indique ce qui suit concernant la compatibilité des pointeurs de fonction: P>

3 em> Un type composite peut être construit à partir de deux types compatibles; C'est un type compatible avec les deux types et satisfait les conditions suivantes: p>

  • Si les deux types sont des types de réseau, les règles suivantes sont appliquées:
    • Si un type est un tableau de taille constante connue, le type composite est un tableau de cette taille. LI>
    • sinon, si un type est un réseau de longueur variable dont la taille est spécifiée par une expression qui n'est pas évaluée, la le comportement est indéfini. LI>
    • sinon, si un type est un tableau de longueur variable dont la taille est spécifiée, le type composite est un réseau de longueur variable de cette taille. li>
    • sinon, si un type est un réseau de longueur variable de taille non spécifiée, le type composite est un réseau de longueur variable de non spécifié Taille. Li>
    • Sinon, les deux types sont des matrices de taille inconnue et le type composite est un éventail de taille inconnue. Le type d'élément de Le type composite est le type composite des deux éléments Types. LI> ul> li>
    • Si un seul type est un type de fonction avec une liste de types de paramètres (prototype de fonction), le type composite est une fonction Prototype avec la liste de types de paramètres. strong> li>
    • Si les deux types sont des types de fonctions avec des listes de types de paramètres, le type de chaque paramètre de la liste des types de paramètres composite est le Type composite des paramètres correspondants. strong> li> ul>

      ... p>

      5 em> Exemple compte tenu des deux déclarations d'étendue de fichiers suivantes: p>

      int (*)(int, int, long);    // a function taking an int, an int, and a long, and returns an int
      


0 commentaires