Pouvez-vous faire une incrémentation compilateur constante?
Tout en sonnant absurde.....
Je veux une Constante à chaque fois que vous l'utilisez il s'incrémente de 1
int x;
int y;
x = INCREMENTING_CONSTANT;
y = INCREMENTING_CONSTANT;
où x == 1; y == 2
Remarque je ne veux pas y = INCREMENTING_CONSTANT+1 type de solutions.
Fondamentalement, je veux l'utiliser comme un moment de la compilation ID unique ( en général, il ne serait pas utilisé dans le code comme dans l'exemple, mais à l'intérieur d'une autre macro)
Puisque la variable est compilateur de base, nous avons besoin de savoir quel compilateur tu parles.
cross compilateur... idéalement tel qu'il sera utilisé sur au moins 3 compilateurs.
cela fait doublons stackoverflow.com/questions/2076757/incremented-define mais les solutions sont pour le C++, mais va voir si j'ai les mêmes techniques peuvent être utilisées pour C
Macro augmentation de la valeur et puis concaténer
c'est pour le C++ et si vous cochez cette réponse il existe une solution pour faire ce qu'ils veulent en C++
cross compilateur... idéalement tel qu'il sera utilisé sur au moins 3 compilateurs.
cela fait doublons stackoverflow.com/questions/2076757/incremented-define mais les solutions sont pour le C++, mais va voir si j'ai les mêmes techniques peuvent être utilisées pour C
Macro augmentation de la valeur et puis concaténer
c'est pour le C++ et si vous cochez cette réponse il existe une solution pour faire ce qu'ils veulent en C++
OriginalL'auteur Keith Nicholas | 2010-03-31
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas la norme, mais certains compilateurs soutenir le
__COUNTER__
macro. Voir Quelqu'un a eu une utilisation pour l' __CONTRE__ pré-processeur de macro?OriginalL'auteur quinmars
Si vous avez juste besoin quelque chose d'unique ID ish, pouvez-vous utiliser le
__LINE__
symbole de préprocesseur? Ce n'est pas ce que vous demandez, mais il pourrait fonctionner pour vous.LIGNE: Est ce que je veux déplacer loin de l'aide de
OriginalL'auteur Stephen Canon
Vous pourriez être en mesure de mettre quelque chose ensemble à l'aide de coup de pouce.Préprocesseur (Fonctionne avec C) et
BOOST_PP_COUNTER
Exemple donné sur le docs page:
Traduit en ce que vous voulez
Vous pouvez également utiliser des fentes (un peu plus souple au prix de plus de code que la solution ci-dessus):
OriginalL'auteur Yacoby
Dans mon cas, je voulais avoir un système de clé unique pour chaque sous-système, mais la sélection de sous-systèmes dépend de la personne qui utilise le système. Il fallait 8-bits des valeurs, car il est ciblé sur des systèmes embarqués.
C'est ce que j'ai trouvé tout à l'heure:
Le défi sera de s'assurer que l'inclure la chaîne, qui apporte à chacun de ces blocs est compilé dans le même ordre à chaque fois.
OriginalL'auteur Erik Walthinsen
J'ai souvent souhaité, pour compiler des temps variables. Toutefois, la meilleure chose à faire serait juste pour définir des constantes pour chaque invididually.
La réponse au-dessus de moi thread du problème pourrait être résolu par l'utilisation d'un functionoid dans certaines global classe d'état ou d'un même type de solution si vous êtes à l'aide de C plutôt que C++.
Vous pouvez également essayer d'utiliser un xmacro. Créer un nouveau fichier, nous allons l'appeler xmacro.h
Puis, dans un en-tête standard,
Je n'ai pas testé, mais xmacros avoir une certaine puissance impressionnante que la pratique régulière de macros ne pouvez pas utiliser, comme defs/undefs, et mon petit doigt me dit qu'il doit travailler. Le préprocesseur est puissant, mais plutôt bête, donc il risque d'échouer.
Cela ne fonctionne pas - le préprocesseur ne pas voir les directives qui sont le résultat de la macro expansion.
Je suis tombé sur cette solution de façon indépendante, il a essayé, et ça ne fonctionne pas... c'est pourquoi je suis ici 🙂
OriginalL'auteur Puppy
Voulez-vous
x
ety
être constantes eux-mêmes? Si donc, le plus simple et le plus propre chose à faire est peut-être d'utiliser une énumération anonyme:Cela signifie que vous suffit d'ajouter un nouveau nom à la liste et elle lui sera donnée à la prochaine valeur de type entier. C'est une astuce utile lorsque vous ne vous souciez pas de ce que les valeurs sont (en dehors de l'exécution), aussi longtemps que leur distinctes. Par exemple, lors de l'attribution des identifiants pour les contrôles dans une interface graphique, vous voyez souvent:
Certains GUI cadres de fournir un GetUserId() fonction qui va générer un nouveau (à l'aide d'un interne variable statique); mais je pense que ce qui se passe au moment de l'exécution. C'est aussi un peu fastidieux à la longue de voir le nombre d'appels dans la succession.
Je ne sais pas pourquoi c'est un problème. Pourquoi est-il plus difficile pour ajouter un nouvel élément d'une énumération que c'est à (dire) ajouter une autre ligne de code de l'initialiser à une constante, d'ailleurs?
parce que la macro peut apparaître à tout moment dans le code. Il sera probablement dans le corps d'une fonction.... et une autre Macro serait dans le corps d'une autre fonction, etc etc, il y aura une quantité arbitraire de références à la macro dans de nombreuses fonctions différentes. Chaque fois que la macro s'affiche, je veux qu'il incrémente de 1
OriginalL'auteur Edmund
Bien, elle n'est pas constante alors, est-il? 😉
Vous pouvez le faire avec une fonction:
Comme indiqué, ce n'est pas thread-safe. Pour ce faire, vous avez besoin de protéger ce avec un mutex, ou utiliser un compilateur/plate-forme spécifique atomique incrementer.
Je ne pense pas que c'est tout à fait ce qu'il veut. Cela va générer une nouvelle valeur au moment de l'exécution chaque fois que la fonction est appelée. Je pense qu'il veut la valeur à calculer une fois au moment de la compilation, la même valeur est utilisée chaque fois que la ligne est exécutée.
OriginalL'auteur Tim
"L'incrémentation de la constante" est un oxymore. Vous ne pouvez pas le faire au moment de la compilation.
En fait c'est beaucoup de valeurs constantes, chacune plus grande que celle d'avant
OriginalL'auteur richb
Voici une vilaine façon de la mettre en œuvre.
OriginalL'auteur JayM