如果你經(jīng)常用心的去琢磨寫東西的話,那么你會有很多發(fā)現(xiàn),今天給大家看看我的一個發(fā), C的預(yù)編譯指令\"#\"的一個應(yīng)用。
#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) ,這個用法比較少,但還是蠻有用的。
結(jié)構(gòu)成員name,如果用example.##a,那么就會提示告警:
warning: pasting \".\" and \"name1\" does not give a valid preprocessing token
對編譯器來說,由于\".\"或者\(yùn)"->\"分隔符號的存在,宏a被視為一個獨(dú)立的符號,所以使用\"##“會有問題的,可以直接使用宏a來替換。但編譯的結(jié)果也是正確的。
宏MACRO ,#MACRO,##MACRO,這幾個方法組合在一起,靈活應(yīng)用,會產(chǎn)生很多有意思的效果。
#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) ,這個用法比較少,但還是蠻有用的。
結(jié)構(gòu)成員name,如果用example.##a,那么就會提示告警:
warning: pasting \".\" and \"name1\" does not give a valid preprocessing token
對編譯器來說,由于\".\"或者\(yùn)"->\"分隔符號的存在,宏a被視為一個獨(dú)立的符號,所以使用\"##“會有問題的,可以直接使用宏a來替換。但編譯的結(jié)果也是正確的。
宏MACRO ,#MACRO,##MACRO,這幾個方法組合在一起,靈活應(yīng)用,會產(chǎn)生很多有意思的效果。

