2009-12-03 5 views
3

Une question similaire a déjà été posée, mais aucune des réponses n'a vraiment fourni ce que je cherchais.Emplacement de const dans une fonction

Je n'arrive pas à déterminer l'emplacement des droits dans une fonction. Je sais que beaucoup de gens les mettent au sommet, mais si vous les placez le plus près possible de l'endroit où vous les utilisez, vous réduisez la durée du code. C'est à dire.

void f() { 
    const FOO = 3; 
    ...// some code 
    if (bar > FOO) { 
    ...// do stuff 
    } 
} 

ou

void f() { 
    ...// some code 
    const FOO = 3; 
    if (bar > FOO) { 
    ...// do stuff 
    } 
} 

Je penche vers l'utilisation de la const en haut dans les petites fonctions, et de garder la durée aussi près que possible dans les grandes fonctions, mais je me demandais ce que les styles autres/pensées sont à ce sujet.

Répondre

8

Au plus bas niveau possible, et directement avant leur première utilisation. En ce qui concerne le style, des exceptions peuvent être faites pour la clarté/l'asthénie, par exemple en regroupant des constantes conceptuellement similaires.

0

Votre approche semble correcte.

Je mets même ces nombres magiques en haut d'un fichier, pour m'assurer que les «paramètres» ou les tweakables sont très visibles pour les autres.

0

Cela dépend de ce que vous voulez vraiment faire. Je les mets d'habitude très près d'où ils sont réellement utilisés. Je les mets sur le dessus quand ils sont groupés et pour donner un sens à celui que vous devez regarder les autres (par exemple quand une constante dépend d'une autre constante).

3

Plusieurs fois, les valeurs const sont placées en haut du fichier afin qu'elles soient facilement reconnaissables (et "trouvables") pour les personnes en développement. Cependant, si vous avez seulement besoin d'une valeur const pour un très petit morceau de code, il vaudrait mieux qu'elle soit limitée à l'endroit où vous en avez besoin.

0

Surtout si vous allez coder un algorithme plus long ayant toutes les valeurs de départ (y compris les valeurs const) et les variables déclarées en haut de la fonction rend beaucoup plus clair la lecture de l'algorithme lui-même.

1

Je recommande de les placer dans le fichier d'en-tête sous un espace de noms ou une classe.

0

Dans les versions antérieures à C99 de C, vous ne pouviez définir que des variables au début des blocs. Par conséquent, la deuxième alternative n'était pas un code C valide. Je pense que Code Complete est favorable à ce que la déclaration soit aussi proche que possible de la première utilisation, mais certains auraient contesté cette règle sur la base des raisons qui la rendent incohérente entre C et C++.

Maintenant que les deux standards C et C++ vous permettent de déplacer la déclaration proche de la première utilisation, cette objection ne tient plus.

Il y a des moments où il y a des raisons impérieuses pour lesquelles mettre la déclaration le plus tard possible est préférable pour les variables non-const que dans la partie supérieure. Par exemple, une déclaration sans initialisation ouvre la possibilité de lire accidentellement une variable non initialisée. En outre, en C++, déclarer une variable de classe en haut de la fonction sans initialisation appelle le constructeur par défaut. Quand il est assigné plus tard, il appelle l'opérateur d'affectation. Si la variable a été déclarée à la place de l'initialisation, cela appelle le constructeur de la copie.Le coût d'un constructeur + affectation par défaut peut souvent être supérieur au coût du constructeur de copie.

Ce dernier argument ne peut s'appliquer qu'aux variables non const, puisqu'il n'y a pas d'affectation sur une variable const. Mais, pourquoi voudriez-vous avoir à chercher dans un endroit différent pour vos déclarations const? Et si const int n = 3; est évidemment const, qu'en est-il de const char * s = "FOO" ;? Est-ce que c'est suffisant pour appartenir au sommet ou pas? Ou doit-il être const char * const s = "FOO"? De plus, que se passe-t-il si vous ne savez pas encore quelle valeur vous voulez que votre variable const soit initialisée en haut, alors doit reporter en déclarant votre variable const jusqu'à ce que vous sachiez à quoi il doit être initialisé.

Questions connexes