ProgrammationProgrammer système

Décrivez les différences entre les fonctions à nombre d'arguments variable et les fonctions standard en C. Comment implémenter une fonction à nombre d'arguments variable ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

En langage C, les fonctions peuvent accepter un nombre fixe ou variable d'arguments. Les fonctions standard sont définies comme suit:

int sum(int a, int b) { return a + b; }

Pour un nombre variable d'arguments, le macro <stdarg.h> est utilisé, ce qui permet de traiter un nombre différent de paramètres d'entrée.

Exemple:

#include <stdarg.h> #include <stdio.h> int sum(int count, ...) { int total = 0; va_list args; va_start(args, count); for (int i = 0; i < count; ++i) { total += va_arg(args, int); } va_end(args); return total; }

Question piège

Quelles sont les différences entre les fonctions à nombre d'arguments variable et les fonctions surchargées, et comment réaliser la surcharge en C ?

Réponse: En C, il n'y a pas de prise en charge de la surcharge des fonctions comme en C++ : le nom de la fonction et le nombre d'arguments doivent être uniques. Les arguments variables fournissent une interface universelle, mais ce n'est pas de la "surcharge".

Exemple (incorrect):

// Cela ne fonctionnera pas en C, car on ne peut pas créer deux fonctions avec le même nom: int foo(int a); float foo(float b); // Erreur de compilation.

Exemples d'erreurs réelles dues à l'ignorance des subtilités du sujet


Histoire

Dans un grand projet, une fonction à nombre d'arguments variable a été utilisée, mais le type des valeurs passées n'a pas été vérifié. Il était attendu que tous les arguments soient de type int, mais une fois un double a été passé, ce qui a conduit à une lecture incorrecte de la mémoire et à un plantage aléatoire de l'application.

Histoire

Un développeur a oublié d'appeler va_end, ce qui a conduit à une fuite de ressources sur certaines architectures. Les symptômes n'ont apparaissent que lors de l'utilisation répétée de la fonction.

Histoire

Lors du traitement d'une fonction avec des arguments variables, va_list a été utilisé deux fois sans appel de va_copy, ce qui a causé un comportement imprévisible. L'erreur ne s'est pas manifestée immédiatement, mais seulement après des modifications du compilateur.