曾经看到一个很多意思的代码,它的大概目的是用一个宏来同时替换一个结构的成员同时产生一个字符串,如下例:
#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,这几个方法组合在一起,灵活应用,会产生很多有意思的效果。
#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,这几个方法组合在一起,灵活应用,会产生很多有意思的效果。