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

字號:

如果你經(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)生很多有意思的效果。