Peut un C de la définition de macros se référer à d'autres macros?
Ce que j'essaie de comprendre si quelque chose comme cela (écrit en C):
#define FOO 15
#define BAR 23
#define MEH (FOO / BAR)
est-elle autorisée? Je voudrais le préprocesseur à remplacer chaque occurrence de
MEH
avec
(15 / 23)
mais je ne suis pas sûr que cela va fonctionner. Certes, si le préprocesseur passe seulement par le code une seule fois, puis je ne pense pas que ça comme je le voudrais.
J'ai trouvé plusieurs exemples de ce genre, mais tous étaient vraiment trop compliqué pour moi à comprendre. Si quelqu'un pouvait m'aider à sortir de ce simple je vous en serai éternellement reconnaissant!
- Avant la lecture de votre question, je pensais que vous étiez question de savoir si une définition de macro peut définir une autre macro, comme
#define FOO(x) #define BAR x
. La réponse à cette question (qui n'a pas fait de demande) est non; une définition de macro ne peut pas inclure d'autres directives de préprocesseur. Je vais éditer ton titre pour le rendre plus clair ce que vous demandez. - Google X-Macros, en profiter.
Vous devez vous connecter pour publier un commentaire.
Mot, oui. Vous pouvez imbriquer les définit et les macros comme celle - autant de niveaux que vous le souhaitez tant qu'il n'est pas récursive.
MEH
être #défini en premier?MEH
,FOO
etBAR
tous définis lors de laMEH
s'affiche. Le préprocesseur première remplaceMEH
avec(FOO / BAR)
, puis recommencer, en remplacement de la premièreFOO
avec15
puisBAR
avec23
MEH
premier (qui est basé surFOO
etBAR
), puisFOO
etBAR
par la suite, et il fonctionne toujours très bien. Ce qui semble d'abord comme il ne devrait pas fonctionner, mais encore une fois, il fonctionne très bien. Par conséquent, le préprocesseur doit stocker toutes les définir dans une table de hachage comme il va, mise à jour des éléments qu'il trouve de nouvelles définitions ou il doit faire plusieurs passes. Indépendamment de comment il le fait, il ne fonctionne en effet, quel que soit l'ordre de la définit.La réponse est "oui", et deux autres personnes ont correctement indiqué.
Comme pour pourquoi la réponse est oui, les détails techniques sont dans la C standard, section 6.10.3.4, "Rescanner et davantage de remplacement". Les OP ne peuvent pas bénéficier de cela, mais d'autres pourraient être intéressés.
Oui, ça va fonctionner.
Mais pour votre information personnelle, voici quelques règles simplifiées concernant les macros qui pourrait vous aider (c'est hors de portée, mais sera probablement vous aider à l'avenir). Je vais essayer de le garder aussi simple que possible.
Le définit sont "définis" dans l'ordre où ils sont inclus/lire. Cela signifie que vous ne pouvez pas utiliser une définition qui n'a pas été définie précédemment.
Utile de pré-processeur mot-clé: #define, #undef, #else, #elif, #ifdef, #ifndef, #si
Vous pouvez utiliser n'importe quel autre précédemment #define dans votre macro. Ils seront étendus. (comme dans votre question)
Fonction des définitions de macros accepter deux opérateurs spéciaux (# et ##)
opérateur # stringize l'argument:
opérateur ## concatène deux arguments
Il y a quelques macros prédéfinies (de la langue) ainsi que vous pouvez utiliser:
Voir votre compilateur section sur que pour avoir une liste exhaustive, car il n'est pas "de la croix-plate-forme"
Vous verrez que les gens utilise un journal de parenthèses "()" lors de la définition des macros. La raison en est que lorsque vous appelez une macro, il est en expansion "comme est"
Je voudrais ajouter une chasse aux sorcières qui a déclenché moi.
Fonction de style macros ne peut pas ce faire.
Exemple qui ne compile pas quand utilisé:
Oui, c'est pris en charge. Et pas mal utilisé!
Une chose importante à noter, cependant, est de assurez-vous que vous paranthesize l'expression, sinon vous pourriez avoir des méchants questions!
FOO
est2+2
5 * (10/3)
est de 15, alors que5 * 10/3
est de 16