Considérons un cas où l'on vous demande de fournir une fonction qui répond au prototype suivant
void dostuff(int x, int y, int z);
Et disons que vous opérez dans un espace 2D et que vous n'utilisez pas de z
dans votre implémentation. Vous pouvez
void dostuff(int x, int y, int z)
{
// use x and y
}
et d'ignorer z
mais le compilateur repérera probablement que vous avez défini mais pas utilisé z
et vous avertir que vous pourriez faire une erreur. Au lieu de cela, vous pouvez
void dostuff(int x, int y, int )
{
// use x and y
}
et laisser de côté la définition de z
. Le compilateur accepte et rejette silencieusement le troisième paramètre car il sait que vous ne le voulez pas.
Vous ne voulez pas simplement désactiver l'avertissement à cause d'erreurs comme celle-ci
void dostuff(int x, int y, int z)
{
for (int z = 0; z < MAX; z++)
{
// use x and y and z, the local z.
}
}
Lorsqu'un index de boucle mal nommé fait de l'ombre au paramètre z
. L'entrée de l'appelant est maintenant ignorée et cela pourrait avoir de mauvaises conséquences. Cette erreur est souvent difficile à repérer avec l'œil de la marque 1, surtout si l'entrée locale z
est enfouie quelque part dans une fonction complexe.
Chaque fois que le compilateur peut repérer un bogue possible dans votre code, profitez-en. Cela signifie moins de travail pour vous.
17 votes
Réduire au silence les avertissements concernant les paramètres inutilisés.
0 votes
Je n'ai reçu aucun avertissement dans Visual Studio en utilisant les paramètres par défaut pour le code ci-dessus.
9 votes
Parfois, vous avez simplement besoin d'une signature spécifique pour vous conformer à une interface donnée. Mais vous n'avez pas vraiment besoin du paramètre.
3 votes
@programmerravi C'est précisément ce qui a été dit dans les commentaires. Vous n'obtenez pas d'avertissements pour les paramètres inutilisés si vous ne donnez pas de nom au paramètre, contrairement au fait de lui donner un nom et de ne pas l'utiliser.
17 votes
Parfois, vous avez besoin d'un argument que vous n'utiliserez jamais. Le cas le plus courant peut être de désambiguïser entre des surcharges. Un exemple standard serait
operator++(int)
vsoperator++()
(opérateurs de pré et post incrémentation des membres). Il peut également être utilisé avec les systèmes de répartition des étiquettes.3 votes
"ne fonctionnera pas en Java" - Une partie de la raison est qu'en Java il n'y a pas de distinction entre déclaration et définition. Une autre partie est qu'ils sont plus "protecteurs" du programmeur et ont considéré beaucoup de choses comme inutiles et éventuellement confuses pour le programmeur, ceci pourrait être l'un d'entre eux.
1 votes
Ce n'est pas une idissyncrasie du C/C++ : la construction est invalide en C.