C compiler error: stray '##' dans le programme
Je travaillais avec un intégré à la source du noyau quand j'ai vu quelque chose comme ceci:
#define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src, clksrc_nr, clksrc_src) \
static void __init omap##name##_timer_init(void) \
{ \
omap2_gp_clockevent_init((clkev_nr), clkev_src); \
omap2_gp_clocksource_init((clksrc_nr), clksrc_src); \
}
et quand j'ai essayé de faire un programme qui a utilisé cette ## chose (que je ne connais pas le nom) pour voir ce que ça pourrait vraiment le faire je n'ai pas réussi à le faire fonctionner. Ci-dessous est ce que j'ai fait pour tester la fonction. Je veux juste voir si l'argument à l'intérieur de l' ## est littéral ou non, mais clairement, quelque chose manque dans mon code pour qu'il compile...
#include <stdio.h>
#include <stdlib.h>
#define DEFINE_1 2
#define DEFINE_2 4
#define DEFINE_3 6
#define DEFINE_i 9
int main(void)
{
int i;
for(i=1;i<4;i++) {
printf("numero %d = %d\n",i,DEFINE_##i##);
}
return EXIT_SUCCESS;
}
La sortie de gcc est:
test.c: In function ‘main’:
test.c:14:5: error: stray ‘##’ in program
test.c:14:33: error: ‘DEFINE_’ undeclared (first use in this function)
test.c:14:33: note: each undeclared identifier is reported only once for each function it appears in
test.c:14:42: error: expected ‘)’ before ‘i’
test.c:14:42: error: stray ‘##’ in program
Quelqu'un sait quel est le problème? Grâce
- Le préprocesseur n'a pas la moindre idée de ce
i
est et comment concaténer les DEFINE_ avec elle - il sera reconnu uniquement pendant et après la compilation, longtemps après le préprocesseur terminé son travail. Si vous ne pouvez pas utiliser les variables du programme que des morceaux de ## concaténation...
Vous devez vous connecter pour publier un commentaire.
C'est le jeton de concaténation opérateur pour le préprocesseur C. La raison que votre exemple ne se compile pas, c'est parce que vous n'êtes pas à l'aide de la
##
opérateur à l'intérieur d'un macro (c'est à dire#define
déclaration).Voici un autre post avec plus d'information.
##
moyens de concaténation au moment de prétraitement.http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html
Vous pouvez utiliser ## dans les directives de préprocesseur seulement.
## est utilisé pour la concaténation dans les macros du préprocesseur C.
Dans votre exemple, l'idée est de concaténer omap avec le nom de la fonction. Par exemple
OMAP_SYS_TIMER_INIT(foo, ...)
va créer une fonction nommée omapfoo.
##
est jeton de collage de l'opérateur et que vous ne pouvez l'utiliser que dans une définition de macro. Vous ne pouvez pas l'utiliser en dehors d'une définition de macro.Peut-être ce que vous essayez de faire est, DEFINE_ et (i=1) concaténer à l'aide de ## formulaire "DEFINE_1" et qui sera votre macro avec la valeur 2. Droit? Si c'est le cas, le problème est que, macro du préprocesseur et la valeur seront en bordée avant l'exécution. Ainsi, il cherche DEFINE_i et il n'y a pas une telle macro. Gardez à l'esprit i=1,2,3.. et ainsi de suite au cours de l'exécution.