2013-07-25 2 views
1

J'essaie d'écrire une macro qui développera la macro __COUNTER__ une seule fois par fichier source. Je comprends parfaitement comment les macros fonctionnent avec leur expansion mais j'ai du mal avec celui-ci. Je veux développer la macro __COUNTER__ une fois en haut du fichier, puis chaque référence à cette définition ne développera pas le __COUNTER__ à son prochain numéro.Développez la macro __COUNTER__ une fois par fichier source

Je souhaite donc développer entièrement __COUNTER__ en une seule valeur, puis utiliser cette valeur uniformément dans le fichier source en cours. Je ne peux utiliser que les fonctions disponibles pour C.

+0

Métaprogrammation de modèle, vous pouvez "générer" des ID exécutant du code au moment de la compilation. –

+0

Je suis limité à utiliser uniquement C donc cette solution doit être sur le préprocesseur –

+0

La valeur doit-elle être disponible au moment de la compilation? Ou peut-il attendre jusqu'à l'exécution? –

Répondre

2

L'extension __COUNTER__ (je suppose que vous utilisez un compilateur de la famille gcc) est trop restreinte pour une telle utilisation. La difficulté est que si vous le mettez dans une autre macro, par exemple TOTO, il n'est pas développé à la définition mais seulement à son utilisation. Ainsi, chaque invocation de TOTO donnera lieu à une nouvelle valeur du compteur.

En P99 J'ai un remplacement portable pour cela, qui atteint cet objectif avec certains #include hackery. P99_FILEID est alors un identifiant par fichier, et P99_LINEID un identifiant qui devrait être unique pour toutes les lignes de votre unité de compilation (mais à utiliser avec précaution). Une autre alternative si vous avez juste besoin d'une constante de temps de compilation et rien dans le préprocesseur lui-même serait d'utiliser le compteur dans une constante d'énumération.

enum { toto_id = __COUNT__, }; 
+0

Cela ressemble beaucoup à ce dont j'ai besoin, où je peux télécharger votre P99 et où puis-je voir sa licence? –

+0

@FixixJones, tout ce que vous trouvez via la page principale p99.gforge.inria.fr. La licence est QPL, mais nous espérons qu'elle deviendra bientôt GPL. –

+0

Ne semble pas fonctionner, chaque fichier a le numéro 1111. Je suppose que c'est parce que la macro n'est pas conservée entre les entrées de source, je vais devoir voir si je peux le définir comme une définition globale pour mon compilateur –

Questions connexes