##在C语言中是预算符 例如:#define X(n) x##n 则 X(1)就是x1,X(2)就是x2,说白了,##就是将x和n粘起来。 如果要定义一系列有序函数,可用##n##实现。如下是LPC313x的中断处理中用到的技巧。 首先定义一个宏定义ROUTER_HDLR(n): 116 #define ROUTER_HDLR(n) \ 117 static void router##n##_handler (unsigned int irq, struct irq_desc *desc) { \ 118 u32 status, bank, bit_pos; \ 119 if (IRQ_EVTR##n##_START == IRQ_EVTR##n##_END) { \ 120 /* translate IRQ number */ \ 121 irq = IRQ_EVTR##n##_START; \ 122 generic_handle_irq(irq); \ 123 } else { \ 124 for (irq = IRQ_EVTR##n##_START; irq <= IRQ_EVTR##n##_END; irq++) { \ 125 /* compute bank & bit position for the event_pin */ \ 126 bank = EVT_GET_BANK(irq_2_event[irq - IRQ_BOARD_START].event_pin); \ 127 bit_pos = irq_2_event[irq - IRQ_BOARD_START].event_pin & 0x1F; \ 128 status = EVRT_OUT_PEND(n, bank); \ 129 if (status & _BIT(bit_pos)) \ 130 generic_handle_irq(irq); \ 131 } \ 132 } \ 133 } 宏定义ROUTER_HDLR(n)中的n,要在函数名中使用,是通过##n##实现的,这样就可以定义一系列有序号的函数了。 137 ROUTER_HDLR(0) // static void router0_handler() 141 ROUTER_HDLR(1) // static void router1_handler() 145 ROUTER_HDLR(2) // static void router2_handler() 149 ROUTER_HDLR(3) // static void router3_handler() 这几句声明其实就是声明和实现了roter0_handler() ~ router3_handler() 3个函数。 最后使用按照正常的函数使用即可: 266 /* install chain handler for IRQ_EVT_ROUTER0 */ 267 set_irq_chained_handler (IRQ_EVT_ROUTER0, router0_handler); 271 /* install chain handler for IRQ_EVT_ROUTER1 */ 272 set_irq_chained_handler (IRQ_EVT_ROUTER1, router1_handler); 276 /* install chain handler for IRQ_EVT_ROUTER2 */ 277 set_irq_chained_handler (IRQ_EVT_ROUTER2, router2_handler); 281 /* install chain handler for IRQ_EVT_ROUTER3 */ 282 set_irq_chained_handler (IRQ_EVT_ROUTER3, router3_handler); 直接在代码中寻找roter0_handler ~ router3_handler的标号是找不到的。 |