Pourquoi les règles MISRA interdisent-elles l'utilisation de « #undef » ?
Question
Pourquoi les règles MISRA interdisent-elles l'utilisation de #undef
dans un programme ?Si je veux limiter la portée d'une macro, comment le faire sans utiliser #undef
?
La solution
Fondamentalement, parce que Misra est trop paranoïaque et ne fait pas confiance aux programmeurs pour savoir ce qu'ils font :-) Sérieusement, MISRA essaie d'empêcher certaines erreurs et est guidée par la conviction que si vous interdiez que si vous interdisez des constructions de code potentiellement problématiques, la fiabilité de logiciel augmente soudainement. Que ce soit vrai est une question de débat. Dans le cas de #undef
, la raison probable est qu'une fois la macro définie, son expansion reste placée et est toujours celle de son définissant. Si vous autorisez #undef
, l'identifiant pourrait être réutilisé en tant que membre de la fonction de fonction, de la fonction, de la fonction TypeDEF ou de la structure / Union, ou même en tant que macro avec A, Gasp, Différents d'expansion . Il est un moyen de prévenir l'observation de l'identifiant, si vous voulez. Effrayant, n'est-ce pas ?! Vous décidez!
Pour répondre à votre deuxième question, le seul moyen de limiter la portée d'une macro si #undef
ne peut pas être utilisé consiste à utiliser la fin de fichier, ce qui est le seul autre moyen défini pour mettre fin à la portée d'un macro. En d'autres termes, vous devez diviser vos fichiers source en plus petits et définir la macro uniquement lors de la compilation du fichier particulier où il est nécessaire.
Autres conseils
MISRA a sa propre explication sur les raisons pour lesquelles l'utilisation de #undef
est interdite:
#undef ne devrait normalement pas être nécessaire.Son utilisation peut prêter à confusion quant à l'existence ou à la signification d'une macro lorsqu'elle est utilisée dans le code.
En réponse au commentaire de @ Bubble ci-dessus:
Vous demandant de donner un exemple à ce sujet.Je ne peux pas imaginer comment ça peut créer une confusion?
Imaginez le scénario ...
#define MACRO some-definition . . MACRO // Invovation 1 . . MACRO // Invocation 2 . .
Et alors une personne vient et insère, entre les invocations existantes de Macro
. . #undef MACRO #define MACRO something-else MACRO // Between (1) and (2) . .
La deuxième invocation originale de Macro ne fera pas ce que vous attendez!