Par exemple, si je devais créer un STATR STATR Const> similaire à celui-ci dans un en-tête (
.h code>) Fichier:
foo_t *foo = foo_create(FOO_STRATEGY.ALLOCATION.STATIC, FOO_STRATEGY.STRUCTURE.TREE);
3 Réponses :
Les gens ne font pas cela parce que c'est ce que Enum code> est pour. p>
Mais Enums ont une portée globale.
Mais la différence entre foo_strategy.allocation.static code> et
foo_strategy_allocation_static code> est si minuscule, c'est vraiment inexistant dans le monde réel. Si cela vous dérange vraiment, utilisez-le beaucoup, utilisez des espaces de noms C ++.
@Danielkamilkozar: Les espaces de noms C ++ ne sont pas disponibles en C, et ils ne résolvent toujours pas ce problème car ils ne peuvent pas être imbriqués.
@Matt en fait avec Enum Classe Code> Vous pouvez faire une bonne chose comme
NS1 :: NS2 :: ENUM_TYPE :: valeur code>.
@XAQQ: Les espaces de noms C ++ ne peuvent pas être imbriqués, mais les classes avec des membres statiques peuvent être utilisées à la place.
Que voulez-vous dire "ne peut pas être imbriqué"? Espace de noms FOO {Stratégie d'espace de noms {Allocation de noms de noms {statique const int statique = 1; statique const int dynamic = 2; }}} code> fonctionne simplement bien, sauf si je vous ai mal compris. Bien sûr, cette solution ne fonctionnera pas pour vous à cause du choix de la langue, mais c'est néanmoins valable. :)
@Danielkamilkozar: Pour une raison quelconque, j'avais pensé qu'ils ne pouvaient pas être, mais une recherche rapide de Google me prouve mal. Je ne sais pas pourquoi je pensais ça.
@Matt mais que Enums ont une portée globale i> Les constantes de dénombrement sont des identifiants et ont des phopes lexicaux différents en fonction de l'endroit où ils sont déclarés.
Je suppose que cela fonctionnerait, oui. Cependant, cela augmenterait la taille binaire (sauf si vous êtes optimisé par notre ami le compilateur).
Je suppose que les gens ne l'utilisent pas, car l'utilisation de la définition correctement formée est plus facile. P>
enum foo_strategy_allocation { FOO_STRATEGY_ALLOCATION_STATIC = 1, FOO_STRATEGY_ALLOCATION_DYNAMIC = 2 };
Pour autant que je sache, les variables déclarées comme statique const code> sont toujours optimisées.
Un autre avantage sur Enums est le contrôle sur les datatypes.
Je vois quatre problèmes possibles. Si vous ne vous souciez de rien, allez-y.
Vous perdez la capacité de faire des choses comme cet exemple, où les valeurs ENUM sont utilisées pour "nommer" les indices dans une matrice et la dernière entrée de l'ENUM donne automatiquement la taille de la matrice. P>
typedef enum { COLOR_RED, COLOR_GREEN, COLOR_BLUE, NUM_COLORS } Color; int myPallete[NUM_COLORS]; myPallete[COLOR_RED] = 0xf80000;
1: Merci pour votre contribution. 2: Variables déclarées comme statique const code> serait optimisée par tout compilateur SANE. 3: Je n'ai jamais dit que cela ne confondait pas les gens, seulement que je ne pense pas que les gens penseraient que ce ne serait pas C. 4: Merci pour votre contribution.
@Matt, re # 2, vous avez probablement raison en général. Mais malheureusement, de nombreux compilateurs dans le monde profondément intégré (pensent que les MCU de 0,10 $ 8 bits avec 2 Ko de RAM) sont loin d'être sains. Je suis curieux de ce que les compilateurs PIC de Microchip feraient par exemple.
Comment est-ce supérieur à utiliser un
enum code>?
@ 5gon12Der Enums ont une portée globale.
@Matt bien oui, mais est-il préférable d'avoir
foo_strategy.allocation.static code> dans votre champ d'application (en raison de votre fichier d'en-tête) ou
foo_strategy_allocation_static code> en tant que valeur définie ou enum?
@Xaqq je pense
foo_strategy.allocument.static code> est meilleur en termes de lisibilité et de convivialité.
Sauf que ce sera un tronquage de tête pour que les personnes devaient utiliser cet en-tête. Est-ce c? C ++? Je crois que l'utilisation de modèles standard est un compromis acceptable pour polluer l'espace de noms global.
@Matt c'est à vous de décider. Être paresseux, j'irais un moyen plus simple de
Enum code> ou
définir code>. Je pense que votre solution va bien.
@Sirdarius: Je ne pense pas que les gens le font en C ++, plus qu'ils ne le font à C. C ++ possèdent ses propres constructions, telles que des membres statiques qui rendent cela inutile. Donc, personne ne confondrait cela avec C ++.
Cela réduirait la chance d'une collision de nommée simplement parce que personne d'autre ne serait assez fou d'utiliser une stratégie aussi compliquée :)