Est-il préférable d’utiliser vars que
préprocesseur ? Ou peut-être que cela dépend du contexte ?
Quels sont les avantages/inconvénients de chaque méthode ?
Est-il préférable d’utiliser vars que
préprocesseur ? Ou peut-être que cela dépend du contexte ?
Quels sont les avantages/inconvénients de chaque méthode ?
Des avantages et des inconvénients à tout, en fonction de l'utilisation:
enum class X
sont analysées par le champ d'application X::
int
mais peut être définie explicitement par le programmeurtemplate <typename T> void f(T t) { cout << ++t; }
ne compile pas, si vous pouvez l'envelopper d'un enum dans une classe implicite du constructeur, opérateur de coulée définies par l'utilisateur et les opérateurs)template <typename T> void f(T)
obtenir un distinct lors de l'instanciation passé de la même valeur numérique à partir de différentes énumérations, qui sont distinctes de toute réelle f(int)
de l'instanciation. Chaque fonction de l'objet du code pourrait être identiques (en ignorant l'adresse de compensations), mais je ne m'attends pas à un compilateur/linker pour éliminer l'inutile copies, si vous pouvez vérifier que votre compilateur/linker si vous vous souciez.enum { A = 1, B = 2 }
- est - A|B
"juridique" à partir d'une logique de programme en perspective?)make
et d'autres timestamp à base de recompilation des outils de déclencher client recompilation lorsqu'ils sont modifiés (mauvais!)#define
ala #define S std::string("abc")
, mais la constante permet d'éviter que plusieurs de construction de différentes temporaires à chaque point d'utilisationconst
de la valeur, qui minimise le travail et l'impact en cas de changement entre les deux#define X "x"
et certains l'utilisation du client ala "pre" X "post"
, si vous voulez ou avez besoin de faire X à l'exécution variable variable plutôt qu'à une constante que vous vigueur des modifications de code client (plutôt que de simplement la recompilation), alors que la transition est plus facile à partir d'un const char*
ou const std::string
étant donné qu'ils ont déjà de la force à l'utilisateur d'intégrer la concaténation des opérations (par exemple, "pre" + X + "post"
pour string
)sizeof
directement définies littéral numériqueunsigned
){ 1, 2 }
qui peut être utilisée pour initialiser des tableaux, ou #define MICROSECONDS *1E-6
etc. (certainement ne la recommande pas!)__FILE__
et __LINE__
peuvent être incorporés dans la substitution macro#if
déclarations pour conditionnellement y compris le code (plus puissant qu'un post-prétraitement des "si" que le code n'a pas besoin d'être compilable si non sélectionné par le préprocesseur), utilisez #undef
-ine, redéfinir etc.make
et d'autres timestamp à base de recompilation des outils de déclencher client recompilation lorsqu'ils sont modifiés (mauvais!)En règle générale, j'utilise const
s et d'en tenir compte le plus professionnel option pour utilisation générale (même si les autres sont d'une simplicité séduisante à ce vieux paresseux programmeur).
Personnellement, je hais le préprocesseur, alors je serais toujours aller avec const.
Le principal avantage d'un #define est qu'il ne nécessite pas de mémoire pour les stocker dans votre programme, car il est vraiment juste de remplacer un texte avec une valeur littérale. Il a aussi l'avantage qu'il n'a pas de type, de sorte qu'il peut être utilisé pour n'importe quelle valeur entière sans générer des avertissements.
Les avantages de "const"s qu'ils sont peut être portée, et ils peuvent être utilisés dans les situations où un pointeur vers un objet doit être passé.
Je ne sais pas exactement ce que vous obtenez avec la partie "statique". Si vous êtes déclarant globalement, je l'avais mis dans un anonomous espace de noms au lieu d'utiliser de l'électricité statique. Par exemple
namespace {
unsigned const seconds_per_minute = 60;
};
int main (int argc; char *argv[]) {
...
}
Si c'est un C++, et il mentionne #define
comme une alternative, alors il est "global" (c'est à dire le fichier-champ) constantes, pas sur les membres de la classe. Quand il s'agit de ces constantes en C++ static const
est redondante. En C++ const
ont une liaison interne par défaut et il n'y a aucun point en déclarant static
. Donc il est vraiment sur const
vs #define
.
Et, enfin, en C++ const
est préférable. Au moins parce que ces constantes sont tapés et étendue. Il y a tout simplement pas de raisons de préférer #define
sur const
, en dehors de quelques exceptions près.
Constantes de chaîne, d'ailleurs, sont un exemple d'une telle exception. Avec #define
d des constantes de chaîne, on peut utiliser au moment de la compilation de concaténation fonction de compilateurs C/C++, comme dans
#define OUT_NAME "output"
#define LOG_EXT ".log"
#define TEXT_EXT ".txt"
const char *const log_file_name = OUT_NAME LOG_EXT;
const char *const text_file_name = OUT_NAME TEXT_EXT;
P. S. Encore une fois, juste au cas où, si quelqu'un parle de static const
comme une alternative à l' #define
, cela signifie généralement qu'ils parlent C, pas du C++. Je me demande si cette question est correctement balisé...
À l’aide d’un public static const est similaire à l’utilisation de toutes les autres variables const dans votre code. Cela signifie que vous pouvez suivre partout où les informations proviennent, par opposition à un #define qui sera tout simplement remplacée dans le code dans le processus de précompilation.
Vous voudrez peut-être jeter un oeil à la C++ FAQ Lite pour cette question : http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.7
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.