C技巧:C的預(yù)編譯指令#的一個(gè)應(yīng)用

字號(hào):

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