Reverse engineering de code et je suis un peu choqué par le style, mais je voulais m'assurer qu'il n'y avait aucune bonne raison de faire ces choses ...
Est-ce juste moi ou est-ce un style de programmation horrible
if ( pwbuf ) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);
Et pourquoi un code wrap non destiné à la compilation dans un
#if 0
....
#endif
Au lieu de commentaires?
EDIT: Donc, comme certains l’expliquent ci-dessous, cela est dû à la possibilité de flummox/* */que je n’avais pas réalisé.
Mais je ne comprends toujours pas, pourquoi ne pas simplement utiliser vos outils d'environnement de programmation ou les macros de l'éditeur de texte favori pour bloquer les commentaires en utilisant "//"
ce ne serait pas beaucoup plus simple et facile à savoir pour sauter visuellement?
Est-ce que je suis juste inexpérimenté dansCet que je manque pourquoi ces choses pourraient être une bonne idée - ou n'y a-t-il aucune excuse, et je suis en droit de me sentir irrité par la laideur de ce code?
#if 0
est utilisé assez fréquemment lorsque le bloc supprimé contient des commentaires de bloc
Je ne dirai pas que c'est une bonne pratique, mais je le vois assez souvent.
La déclaration de ligne unique flow-control + est assez facile à comprendre, même si je l’évite personnellement (et la plupart des directives de codage dans lesquelles j’ai travaillées l’interdisent)
BTW, je modifierais probablement le titre pour être un peu utile "Pourquoi utiliser # si 0 au lieu de bloquer les commentaires"
Si vous avez ce qui suit
#if 0
silly();
if(foo)
bar();
/* baz is a flumuxiation */
baz = fib+3;
#endif
Si vous remplacez naïvement le #if 0
/#endif
par /* */
, le commentaire se terminera juste après flumuxiation, ce qui provoquera une erreur de syntaxe lorsque vous appuierez sur */
à la place du #endif
ci-dessus.
EDIT: Une dernière remarque, souvent la syntaxe #if 0
est simplement utilisée lors du développement, en particulier si vous devez supporter plusieurs versions ou dépendances ou plates-formes matérielles. Il n’est pas rare que le code soit modifié pour
#ifdef _COMPILED_WITHOUT_FEATURE_BAZ_
much_code();
#endif
Avec un en-tête centralisé définissant (ou non) des centaines de ces constantes #define. Ce n’est pas la plus belle chose au monde, mais chaque fois que je travaillais sur un projet de taille décente, nous utilisions une combinaison de commutateurs d’exécution, de constantes à la compilation (this), de décisions de compilation à la compilation (utilisez simplement différentes. cpp en fonction de la version) et de la solution de modèle occasionnelle. Tout dépend des détails.
Bien que vous soyez le développeur qui commence tout juste à faire fonctionner la chose, cependant ... #if 0
est assez courant si vous n'êtes pas sûr que l'ancien code a toujours une valeur.
Les commentaires sont des commentaires. Ils décrivent le code.
Le code exclu de la compilation est du code, pas des commentaires. Il inclura souvent des commentaires, décrivant le code non compilé pour le moment /
Ce sont deux concepts distincts, et imposer la même syntaxe me semble être une erreur.
Outre le problème lié à l'absence d'imbrication des commentaires de style C, la désactivation de blocs de code avec #if 0
présente l'avantage de pouvoir être réduite si vous utilisez un éditeur prenant en charge le pliage de code. Il est également très facile de le faire dans n’importe quel éditeur, alors que la désactivation de gros blocs de code avec des commentaires de style C++ peut être compliquée sans le support/macros de l’éditeur.
En outre, de nombreux blocs #if 0
ont également un bloc else
. Cela permet d’échanger facilement entre deux implémentations/algorithmes et est sans doute moins sujet aux erreurs que de commenter en masse une section et de décommenter une autre. Cependant, vous feriez mieux d'utiliser quelque chose de plus lisible comme #if DEBUG
dans cet événement.
C'est assez idiomatique C juste là. Je ne vois pas ce qui ne va pas avec ça. Ce n'est pas un beau morceau de code, mais c'est facile à lire et ce qui se passe et pourquoi, même sans contexte.
Les noms de variables pourraient être meilleurs, et il serait probablement plus sûr d'utiliser snprintf
ou peut-être strncpy
.
Si vous pensez que cela pourrait être mieux, à quoi préférez-vous ressembler?
Je pourrais faire un léger changement:
char username[32];
strncpy(username, 30, (pwbuf ? pwbuf->pw_name : user_id));
username[31] = '\0';
En ce qui concerne le blocage de commentaires à l'aide de //
, une raison à laquelle je peux penser est que, si vous vérifiez ce code dans votre système de contrôle de source, le journal des reproches vous montrera comme le dernier éditeur pour ces lignes de code. Bien que vous souhaitiez probablement que les commentaires vous soient attribués, le code lui-même vous est également attribué. Bien sûr, vous pouvez revenir en arrière et consulter les révisions précédentes si vous avez besoin de vérifier le journal des auteurs pour le "véritable" auteur du code, mais cela gagnerait du temps si vous conserviez ces informations dans la révision actuelle.
Évidemment, chacun a sa propre opinion sur ce genre de chose. Alors voici le mien:
Je voudrais jamais écrire du code comme ci-dessus et penserais moins à quiconque le ferait. Je ne peux pas compter le nombre de fois où les gens pensent qu'il est acceptable de s'en sortir sans attelles de portée, puis d'être mordus par cela.
Mettre l'instruction de contrôle sur la même ligne que le bloc de code est encore pire; l'absence d'indentation rend plus difficile la visualisation du contrôle de flux lors de la lecture. Une fois que vous avez codé pendant quelques années, vous vous habituez à pouvoir lire et interpréter le code rapidement et avec précision, à condition de pouvoir compter sur certains repères visuels. Contourner ces signaux pour des "cas spéciaux" signifie que le lecteur doit s'arrêter et faire une double prise, sans raison valable.
#if (0)
, en revanche, est ok pendant le développement, mais doit être supprimé une fois que le code est "stable" (ou au moins remplacer 0
par un nom de symbole significatif du préprocesseur).
Woah là-bas! Ne pas réagir excessivement ...
J'appellerais cela plus bâclé pour plus d'espacement inconsistant que toute autre chose. J'ai eu le temps où je trouvais préférable de mettre de courtes déclarations sur la même ligne que leur SI, bien que ces déclarations l'étendent.
Le style en ligne est préférable pour la brièveté verticale ... pourrait facilement être divisé en 4, plus de lignes
if (pwbuf)
sprintf(username,"%s",pwbuf->pw_name);
else
sprintf(username,"%d",user_id);
Personnellement, je déteste le style suivant, car il est si long qu'il est difficile de parcourir un fichier.
if (pwbuf)
{
sprintf(username,"%s",pwbuf->pw_name);
}
else
{
sprintf(username,"%d",user_id);
}
je punti sopra indicati. Ma i moniteur sono écran large et tout le monde, sans exception, sans exception
if (pwbuf) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);
Sembra sempre avere troppo spazio orizzontale et non abbastanza spazio verticale sul mio schermo!
Informez-vous sur le code de la chaîne de traitement pour le préprocesseur, non utile #if 0
; Il n'y a pas de commentaire sur ce code, pas encore utilisé /* */
. Se ha già entrambi, o ricorrere et un editore che ha unctrl+/, par commentaireare molte righe. Dans le cas contraire, se pieno, elimina il codice un titolo definitivo!
if ( pwbuf ) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);
Idiomatique et concis. Si elle a été touchée plus de 2 ou 3 fois, je la mettrais entre crochets et la ligne suivante. Ce n'est pas très maintenable si vous ajoutez des informations de journalisation ou d'autres conditions.
#if 0
....
#endif
Bon pour activer ou non des blocs de code de débogage. En outre, éviterait les erreurs de compilation liées à la tentative de blocage de commentaires de ce type:
/* line comment */
...
/* line comment again */
Puisque les commentaires de bloc C ne sont pas imbriqués.
J'utilise très rarement le style plus concis lorsqu'il prend en charge la symétrie du code et que les lignes ne deviennent pas trop longues. Prenons l'exemple artificiel suivant:
if (strcmp(s, "foo") == 0)
{
bitmap = 0x00000001UL;
bit = 0;
}
else if (strcmp(s, "bar") == 0)
{
bitmap = 0x00000002UL;
bit = 1;
}
else if (strcmp(s, "baz") == 0)
{
bitmap = 0x00000003UL;
bit = 2;
}
else if (strcmp(s, "qux") == 0)
{
bitmap = 0x00000008UL;
bit = 3;
}
else
{
bitmap = 0;
bit = -1;
}
et la version concise:
if (strcmp(s, "foo") == 0) { bitmap = 0x00000001UL; bit = 0; }
else if (strcmp(s, "bar") == 0) { bitmap = 0x00000002UL; bit = 1; }
else if (strcmp(s, "baz") == 0) { bitmap = 0x00000003UL; bit = 2; }
else if (strcmp(s, "qux") == 0) { bitmap = 0x00000008UL; bit = 3; }
else { bitmap = 0; bit = -1; }
Les insectes sont beaucoup plus susceptibles de vous sauter au visage.
Avertissement: Cet exemple est artificiel, comme je l'ai dit. N'hésitez pas à discuter de l'utilisation de strcmp, des nombres magiques et de la pertinence d'une approche basée sur des tables. ;)