2015-09-15 2 views
0

Dans le code C++ sur lequel je travaille, j'ai remarqué que de nombreuses méthodes qui retournent HRESULT suivent une pratique de définition de variable locale à S_OK, puis la renvoient à la fin de la méthode sans la modifier.C++ utilisation de HRESULT pour retourner S_OK

HRESULT function() 
    { 
     HRESULT hr = S_OK; 
     // do some stuff 
     // none of which changes hr 
     ... 
     return hr; 
    } 

Y at-il des avantages du code ci-dessus? Ou puis-je en toute sécurité factoriser à

void function() 
    { 
     // do some stuff 
     // none of which changes hr 
     ... 
    } 

Répondre

3

Le refactoring que vous proposez devrait fonctionner correctement. Notez simplement que s'il y a des endroits dans le code qui utilisent la valeur de retour de la fonction, vous obtiendrez une erreur de compilation, et vous devrez corriger ces endroits.

Notez également que dans les futures versions du code, il sera plus difficile d'ajouter un cas d'erreur à cette fonction, car vous devrez réintroduire la valeur de retour et changer tous les appelants. Le développeur d'origine a probablement retourné S_OK par souci de cohérence, ou une anticipation que la fonction pourrait un jour produire des erreurs.

+0

Le deuxième paragraphe est un peu trompeur. Changer l'interface _always_ nécessite de vérifier les appelants, si vous lancez une exception, mettez 'errno' ou renvoyez' HRESULT (E_OUT_OF_WIDGETS) '. Et si l'ancien code renvoyait toujours 'S_OK', il y a de fortes chances que beaucoup d'appelants ne vérifient pas le code d'erreur. – MSalters

0

Si votre fonction toujours réussit (ou autrement dit quelque chose qui n'exécute échoue), vous pouvez vous en débarrasser. Cela dépend donc du contenu et de ce que fait votre fonction. Si vous passez à void et que vous appelez votre fonction, vous ne saurez jamais si l'appel a "réussi" ou non. Gardez à l'esprit que le corps de la fonction pourrait changer à l'avenir et lorsque vous avez soudainement besoin de retourner une erreur, vous devez mettre à jour les appels pour gérer correctement les erreurs.

+0

Notez également que le compilateur est assez bon à faire cela pour vous. –

+0

La réponse ne couvre pas l'optimisation, c'est une réponse générale pour la sémantique et quand il devrait utiliser des types de retour pour indiquer qu'une erreur s'est produite. – HelloWorld

+0

Bon, je ne fais que répondre à la volonté de l'OP de refactoriser avec un rappel qu'il n'y a probablement rien à gagner. –