1 C语言中"##"的独特用法:胶水运算”(连接字符串的作用),用于把参数宏中的“形参”与其它没有天然分割的内容粘连在一起。
#define def_u32_array(__name, __size) uint32_t array_##__name[__size];
#define safe_atom_code(...) \ { \ uint32_t int_flag = __disable_irq(); \ /*将变参放到下面位置取代__VA_ARGS__*/ __VA_ARGS__ \ __set_PRIMASK(int_flag); \ } static __inline void wr_dat (uint_fast16_t dat) { safe_atom_code( LCD_CS(0); GLCD_PORT->DAT = (dat >> 8); /* Write D8..D15 */ GLCD_PORT->DAT = (dat & 0xFF); /* Write D0..D7 */ LCD_CS(1); ) }
/* ",##__VA_ARGS__",如果__VA_ARGS__是一个空字符串,则前面的","会一并被删除掉 */ #define log_info(__STRING, ...) printf(__STRING,##__VA_ARGS__) log_info("------------------------------------\r\n"); log_info(" Cycle Count : %d", total_cycle_cnt); //展开后: printf("------------------------------------\r\n",);// ",##__VA_ARGS__被删除" printf(" Cycle Count : %d", total_cycle_cnt);
#define XXXX_INIT(...) xxxx_init((NULL,##__VA_ARGS__)) int xxxx_init(xxxx_cfg_t *cfg_ptr); XXXX_INIT() //cfg_ptr=NULL XXXX_INIT(pcfg) //cfg_ptr=pcfg
struct { uint16_t msg; uint16_t mask; int (*handler)(msg_t *msg_ptr); } msg_t; typedef struct msg_t msg_t; #define def_msg_map(__name, ...) \ const msg_t __name[] = {__VA_ARGS__}; #define add_msg(__msg, __handler, ...) \ { \ .msg = (__msg), \ .handler = &(__handler), \ .msk = (0xFFFF, ##__VA_ARGS__), \ } /*! \note 高字节表示操作的类别: 比如0x00表示控制类,0x01表示WRITE,0x02表示READ */ enum { SIGN_UP = 0x0001, WRITE_MEM = 0x0100, WRITE_SRAM = 0x0101, WRITE_FLASH = 0x0102, WRITE_EEPROM = 0x0103, READ_MEM = 0x0200, READ_SRAM = 0x0201, READ_FLASH = 0x0202, READ_EEPROM = 0x0203, }; extern int iap_sign_up_handler(msg_t *msg_ptr); extern int iap_write_mem(msg_t *msg_ptr); extern int iap_read_mem(msg_t *msg_ptr); def_msg_map( iap_message_map /* 严格的将 SIGN_UP 映射到 对应的处理函数中 */ add_msg( SIGN_UP, iap_sign_up_handler ), /* 批量处理所有的WRITE操作,使用掩码进行过滤*/ add_msg( WRITE_MEM, iap_write_mem, 0xFF00 ), /* 批量处理所有的READ操作,使用掩码进行过滤 */ add_msg( READ_MEM, iap_read_mem, 0xFF00 ), )