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. Merci,
Thejack p> p>
3 Réponses :
Les fonctions variadiques de style C sont leur propre bête spéciale. Leurs arguments doivent être déballés avec la famille Compte tenu de votre utilisation de VA_LIST CODE> Fonctions de fonctions. Il n'y a pas de compatibilité avec les fonctions non variadiques, et ce ne sont pas des macros et non. P>
auto code> Je suppose que vous posez des questions sur C ++, malgré la double-marquage. Essayez d'éviter les fonctions comme celle de C ++. P>
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.) P>
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. P>
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. P>
(ce qui précède est vrai pour C et C ++.) P>
en C, ces types sont 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>
... 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
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) code>.