文章标题

#在英语里面叫做 pound

在C语言的宏定义中,一个#表示字符串化;两个#代表concatenate

在宏定义中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),即无论后面的宏变量是字符串还是常量,都当成字符来处理。

而## 被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。

 

举例如下:

  1. #include <iostream>  
  2. void quit_command(){  
  3.     printf(”I am quit command\n”);  
  4. }     
  5. void help_command(){  
  6.     printf(”I am help command\n”);  
  7. }     
  8. struct command  
  9. {  
  10.     char * name;  
  11.     void (*function) (void);  
  12. };    
  13. #define COMMAND(NAME) {#NAME,NAME##_command}  
  14. #define PRINT(NAME) printf(“token”#NAME”=%d\n”, token##NAME)  
  15. main(){  
  16.     int token9=9;  
  17.     PRINT(9);  
  18.     struct command commands[] = {  
  19.         COMMAND(quit),  
  20.         COMMAND(help),  
  21.     };    
  22.     commands[0].function();  
  23. }  

#define COMMAND(NAME) {#NAME,NAME##_command} #define PRINT(NAME) printf(“token”#NAME”=%d\n”, token##NAME) main(){ int token9=9; PRINT(9); struct command commands[] = { COMMAND(quit), COMMAND(help), }; commands[0].function(); }


 

得到的结果是:

 

token9=9
I am quit command

 

其实是对commands[0].function();如何实现比较感兴趣,
首先用宏定义了COMMAND(NAME) {#NAME,NAME##_command}在我看来就是定义了一个“形状”,一个形如{#NAME,NAME##_command}的形状。用command结构体定义了一个结构体数组command[],数组里有两个元素COMMAND(quit)和…,这个元素就形如{#NAME,NAME##_command}这个结构,所以就是给这个结构体对象赋值,在通过调用指针函数实现功能。而,“#”和“##”的功能很清晰明了
下面就是要了解指针函数如何实现的。这个函数如何实现,现在还不是很清楚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值