大电流合金电阻捷比信产品与采购服务联系业务人员

宏的使用:将函数与宏##粘贴在一起,然后使用函数指针查找执行的操作

所有人都经常使用宏,但是它通常只是符号常量的简单定义,类似于#defineWHEEL_SCALE_MM0.53f,#defineLOG_I(tag,text_fmt,...)log_i(tag,text_fmt,## __ VA_ARGS__ ),但除宏之外,还有一个## paste函数,可将其与常量表达式#define一起使用以创建宏定义指针函数列表,然后查询执行函数。不用多说,我们将从今天开始共享。首先,我们将进行常规描述,然后分享“ ##”的神奇效果。粘贴。 1. #define的常规操作#define预处理程序指令与其他预处理程序指令相同,其中#号为行的开头。 ANSI和更高版本的标准都在#符号前允许使用空格或制表符,并且在#与指令的其余部分之间也允许使用空格。但是C的旧版本要求指令从该行的最左侧开始,并且#与指令的其余部分之间不能有空格。该指令可以出现在源文件中的任何位置,并且其定义从该指令出现的位置到文件末尾都是有效的。我们广泛使用#define指令来定义清单常量(也称为符号常量)。预处理程序指令从#开始,并在其后的第一个换行符处结束。换句话说,指令的长度被限制为一行。但是,在预处理开始之前,编译器会将多条物理线处理为一条逻辑线。通常,我们将使用#define表示常量,或使用简单的宏替换函数#defineRX_BUF_SIZE30#defineMBEDTLS_DES_C / *数据加密* /#defineExitIsrEncoder_IsrvoidEncoder_Isr(void){g.dir_count + =(g.dir == 1)?1:-1 ;} #define的每一行(逻辑行)由3部分组成。第一部分是#define指令本身。第2部分是选定的缩写,也称为宏。一些宏表示值(例如本示例),这些宏称为类对象宏。 C语言还具有类似函数的宏,稍后将进行讨论。宏名称中不允许使用空格,并且空格必须遵循C变量的命名规则:只能使用字符,数字和下划线(_)字符,并且第一个字符不能为数字。第三部分(命令行的其余部分)称为替换列表或替换正文。一旦预处理程序在程序中找到宏的实例,它将用替换主体替换该宏。从宏更改为最终替换文本的过程称为宏扩展。请注意,可以在#define行中使用标准C注释。如前所述,每个评论将被一个空格代替。另外,通过将宏参数列表中的最后一个参数写为省略号(即3个点...),我们将更经常使用可变宏参数来实现此功能。这样,可以在替换部分中使用预定义的宏__VA_ARGS__来指示省略号所代表的含义。 #definePR(...)printf(__ VA_ARGS__)假设稍后调用该宏:PR(“ Howdy”); PR(“ weight =%d,shipping = $%。2f”,wt,sp);对于第一次调用时,__ VA_ARGS__扩展为1个参数:“ Howdy”。对于第二个调用,__ VA_ARGS__扩展为3个参数:“ weight =%d,shipping = $%。2f”,wt,sp。因此,扩展后的代码是:printf(“ Howdy”); printf(“ weight =%d,shipping = $%。2f”,wt,sp); 2. #define合作##使用很多人应该知道的“ ##”的用法被称为预处理胶。与#运算符相似,##运算符可用于函数式宏的替换部分。此外,##也可以用作对象宏的替换部分。 ##运算符可以将两个令牌合并为一个令牌。 #definedef_u32_array(__ name,__ size)uint32_tarray _ ## __ name [__ size];实际上,我们可以这样使用它:def_u32_array(sample_buffer,64)宏扩展的效果是:uint32_tarray_sample_buffer [64];就像初始化数组一样,我们也可以粘贴以形成函数。下面是Linux内核中的源代码:__pcpu_size_call_return宏,通过## paste选择要使用的raw_cpu_read_x函数。 #define__pcpu_size_call_return(stem,variable)(((typeof(variable)pscr_ret __; __ verify_pcpu_ptr(&(variable))); switch(sizeof(variable)){case1:pscr_ret __ = stem ## 1(variable); break; case2:pscr_ret __ = stem ## 2(variable); break; case4:pscr_ret __ = stem ## 4(variable); break; case8:pscr_ret __ = stem ## 8(variable); break; default:__ bad_size_call_parameter(); break;} pscr_ret__;} )#defineraw_cpu_read_1(pcp)raw_cpu_generic_read(pcp)#defineraw_cpu_generic_read(pcp)({* raw_cpu_ptr(&(pcp));})这部分是更高级别的宏定义,并且##粘贴函数被定义为宏函数再次#defineraw_cpu_read(pcp)__ pcpu_size_call_return(raw_cpu_read_,pcp)#define__this_cpu_read(pcp)({__