Pourquoi les règles MISRA interdisent-elles l'utilisation de « #undef » ?

StackOverflow https://stackoverflow.com//questions/11665031

  •  11-12-2019
  •  | 
  •  

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?

Était-ce utile?

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!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top