C的预编译指令"#"的一个应用

        曾经看到一个很多意思的代码,它的大概目的是用一个宏来同时替换一个结构的成员同时产生一个字符串,如下例:
       
        #ifndef  __EXAMPLE_H
        #define  __EXAMPLE_H 1

       typedef struct example_st{
            char name[1024] ;
      } example_t ;

    example_t example ;

     #define PRINT_EXAMPLE(a)  printf(#a " = %s /n"  , example.a)


        #endif    /** __EXAMPLE_H */

在原来的代码中,是这样定义的:
  
     #define PRINT_EXAMPLE(a)  (printf(#a " = %s /n"  , example.##a))

#a的含义是用宏a来代替一个字符串,比如PRINT_EXAMPLE(name) = printf("name = %s /n" , example.a) ,这个用法比较少,但还是蛮有用的。
结构成员name,如果用example.##a,那么就会提示告警:
     warning: pasting "." and "name1" does not give a valid preprocessing token
对编译器来说,由于"."或者"->"分隔符号的存在,宏a被视为一个独立的符号,所以使用"##“会有问题的,可以直接使用宏a来替换。但编译的结果也是正确的。

宏MACRO ,#MACRO,##MACRO,这几个方法组合在一起,灵活应用,会产生很多有意思的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值