【原创】【C语⾔】‘#’(井号)和‘##’(双井号)⽤法
⼀,这是个什么玩意
有时候在宏定义或打印语句中经常见到#井号或者##双井号,看着很⽜逼的⽤法
⼆,有⽑⽤啊
#:表⽰字符串化;##:表⽰concatenate(连接)
具体就是,#号的功能是将其后⾯的参数进⾏字符串化操作,即⽆论后⾯的宏变量是字符串还是常量,都当成字符来处理。
## 被称为连接符,⽤来将##两边的内容连接成⼀个。注意这⾥连接的对象是变量就⾏,也不⼀定是宏的变量。
c语言struct用法例子
三,怎么⽤啊
其实知道了上⾯的内容就基本知道怎么⽤了,直接上例⼦
[c]
1. #include <iostream>
2. void
void test_command(){
3.    printf("I am test command\n");
4. }
void test2_command(){
5. void
6.    printf("I am test2 command\n");
7. }
struct testcommand
8. struct
9. {
10. char * commandName;
void (*function) (void
void);
11.    void
12. };
13. #define COMMAND(NAME) {#NAME,NAME##_command}
14. #define PRINT(NAME) printf("test"#NAME"=%d\n", test##NAME)
15. main(){
16. int test9=9;
17.    PRINT(9);
struct testcommand commands[] = {
18.    struct
19.        COMMAND(test1),
20.        COMMAND(test2),
21.    };
22.    commands[0].function();
23.    commands[1].function();
24. }
得到的结果是:
test9=9
I am test1 command
I am test2 command
1、优化代码编程,根据实际项⽬定义。
*2、⼀般情况下,if else分⽀较多的时候⽤switch case结构,如果case分⽀⼜很多的时候,这时候建议⽤数组结构的⽅式,具体⾥⾯有重复定义的东西也可以结合使⽤#或##,其实主要是为了优化编程结构,提⾼代码的编写效率和阅读效率,例如
typedef struct _test_struct_
{
u16  caseId;//各个case id
u16 (*functioinProcess)(u8 tag,u16 len,u8 *data);//处理各个case 的函数
}test_struct;
static test_struct caseIdList[]=
{
{caseId1,caseId1_process_function},
{caseId2,caseId2_process_function},
{caseId3,caseId3_process_function},
{caseId4,caseId4_process_function},
};
然后之前处理各个case分⽀的函数直接循环查询调⽤caseIdList数据即可。如下
void caseprocessfuncton(u8 tag,u16 len,u8 *data)
{
for(i=0;i<sizeof(caseIdList)/sizeof(caseIdList[0]);i++)
{
if(caseIdList[i].caseId == tag)
{
caseIdList[i].functionProcess(tag,len,data);
}
}
}
还有⼀种写法⽤#或##
#define CASEID_PROCESS(NAME)  {NAME,NAME##_process_function}
static test_struct caseIdList[]=
{
CASEID_PROCESS(caseId1),
CASEID_PROCESS(caseId2),
CASEID_PROCESS(caseId3),
CASEID_PROCESS(caseId4),
};
#define  DRV_I2CX_REGISTER(a)    fst_i2c##a##_handle.Instance = I2C##a//主要起连接作⽤的
四、成为⼤神的⽤法
1、记住上⾯的2的⽤法
2、能单独作为⼀部分提出出来的可以提取出来,结合是否可以⽤##来连接从⽽⽤了区分

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。