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...