预处理符号:可以将宏参粘合成字符串的一部分。 预处理符号:可以将宏参粘合成标识符、常量值的一部分。 通常可以用于构造有规律的字符串、标识符、常量值。includestdio。hdefineMACR1(s)sdefineMACR2(a,b)abintmain(void){inthelloworld101;printf(s,MACR1(hello)world);helloworld,将宏参粘合成了一个字符串printf(d,MACR2(hello,world));101,将宏参粘合成了一个标识符printf(d,MACR2(10,1));101,将宏参粘合成了一个字面值常量return0;} 在Linux内核中有一个使用和的真实案例,通过这个例子可以了解到和的价值所在。 (1)没有和时的正常做法defineQDSPMODULEAUDPPTASK1defineQDSPMODULEAUDRECTASK2defineQDSPMODULEUDPREPROCTASK3structadspmoduleinfo{uint32};structadspmoduleinfomoduleinfo〔〕{{。nameAUDPPTASK,。pdevnameadspAUDPPTASK,。idQDSPMODULEAUDPPTASK},{。nameAUDRECTASK,。pdevnameadspAUDRECTASK,。idQDSPMODULEAUDRECTASK},{。nameUDPREPROCTASK,。pdevnameadspUDPREPROCTASK,。idQDSPMODULEUDPREPROCTASK}}; 从这个例子中可以看出,给结构体数组初始化的值的名字很有规律,比如:AUDPPTASKadspAUDPPTASKQDSPMODULEAUDPPTASK1 基于这个规律完全可以使用和处理,在Linux内核中确实也是这么做的。 (2)使用和处理后defineQDSPMODULEAUDPPTASK11defineQDSPMODULEAUDRECTASK22defineQDSPMODULEAUDRECTASK33defineQDSPMODULE(n){。namen,。pdevnameadspn,。idQDSPMODULEn}structadspmoduleinfo{uint32};structadspmoduleinfomoduleinfo〔〕{QDSPMODULE(AUDPPTASK),QDSPMODULE(AUDRECTASK),QDSPMODULE(UDPREPROCTASK)}; 使用和修改后,其实代码的执行效率并没有发生变化,但是使用了和后,确使得源码更加的简洁。 在Linux内核、框架的CC源码中,大量充斥着这种用法,希望通过这里的介绍后,大家不再陌生这样的用法。 如果宏的参数是另一个宏的话,通常需要加一层宏定义,才可以产生预想的效果:includestdio。hdefineNUM100defineSTR(num)numdefineSTR(num)STR(num)intmain(void){printf(s,STR(NUM));return0;} 展开的过程:STR(NUM)STR(NUM)STR(100)100100 如果没有加的这一层,NUM就没有展开的机会。 再看:includestdio。hdefineTAG1infodefineTAG2teacherdefineSTRUCT(a,b)structabdefineSTRUCT(a,b)STRUCT(a,b)加的一层STRUCT(TAG1,TAG2){}intmain(void){return0;} 展开的过程:STRUCT(TAG1,TAG2)STRUCT(TAG1,TAG2)STRUCT(info,teacher)structinfoteacherstructinfoteacher 如果没有加的这一层,TAG1,TAG2就没有展开的机会。 再看一个定义结构体的例子:structinfostudent{charname〔30〕;};structinfoteacher{charname〔30〕;};structinfoadministor{charname〔30〕;}; 比如像以上的这些例子,当需要定义好多结构体类型,而且这些结构体类型的格式还非常相似时(有规律可循),我们可以使用来简化操作,让代码变的更简洁: 2)使用简化后defineSTRUCT(type)structinfotypeSTRUCT(student){charname〔30〕;};STRUCT(teacher){charname〔30〕;};STRUCT(administor){charname〔30〕;};intmain(void){return0;} 预处理后的代码:structinfostudent{charname〔30〕;};structinfoteacher{charname〔30〕;};structinfoadministor{charname〔30〕;};intmain(void){return0;} ref https:www。hhcycj。compostitem382。html End