En effet, mais c'est le principe même d'un préprocesseur de ne pas avoir de liens avec le langage qu'il manipule. Également, si les macros n'ont pas de type, les expressions par lesquelles elles sont remplacées, elles, en ont un.
C'est typiquement pour ca qu'il ne faut pas l'utiliser. Tu te prives de tous les mécanismes de sécurité, de portée, de typage.
Quant à la portée, les macros en ont une : elles sont utilisables du lieu de leur déclaration jusqu'à la fin du fichier sauf si elles sont supprimées auparavant.
Ouais, c'est limite rien que sur le principe de pouvoir faire disparaître un symbole qui devrait être constant.
Au contraire, épiloguons !
Qu'entends-tu par : « consistance globale » ?
Consistance globale de la valeur d'un symbole à travers le sous projet. EN vertue du principe de moindre surprise, une fois symbole défini, surtout une constante, tu es en droit de t'attende à ce qu'il ne change plus. Cette garantie basique, tu ne l'a pas avec des macros.
En effet rien ne te garantie que le define soit le même d'une TU à une autre. Tu peux définir un symbole comme un double dans un fichier, une string dans un autre et ne pas le définir dans un troisième.
J'ai deja vu des bugs subtils à cause d'un changement d'ordre d'inclusion dans les headers car y'avait un undef+nouveau define sur un symbole et qu'on perdait en précision avec ce nouveau define, ce qui donnait des résultats totalement faux…
Avec une variable globale namespacée constante, une fois celle ci définie, bah tu ne peux plus la cacher et tu manges une erreur si tu essayes de définir un symbole avec le même nom ou de redéfinir le même symbole.
Les types énumérés, de même que les constantes énumérées, ont une portée qui est déterminée de la même manière que pour les autres identificateurs.
Ya aucune portée dans les enums…
| enum color{orange};
enum fruit{orange}; //erreur
|
Pour ma part, je reste d'avis que ce n'est pas spécialement une bonne solution : cela réserve de la mémoire inutilement sans apporter de gain(s) réel(s).
Non. Le compilateur va optimiser anyway. Pas contre, ca offre des garanties de typage (et les opérations qui vont avec) fortes appréciables. Notons aussi que tu te prives de tous les constantes générées par des fonctions constexpr si tu utilises des macros au lieu des variables, ce qui serait dommage vu l'avancé que ca représente.