天天看點

c語言宏定義中的#和##

衆所周知宏定義是在編譯器預處理階段進行的文法替換,發生在編譯之前。

“##”是一個連接配接符号,用于把參數連在一起

“#”是“字元串化”的意思。出現在宏定義中的”#”是把跟在後面的參數轉換成一個字元串

int v5 = ;
#define f(n) printf("v "#n" = %d\n", v##n)
f(); //輸出:v 5 = 5
           
//define.c

#include <stdio.h>

#define FUNC_STOP stop

int player_stop()
{
    return ;
}

int player_start()
{
    return ;
}

int player_resume()
{
    return ;
}

int player_play_1x()
{
    return ;
}

typedef struct
{
    int (*stop)();
    int (*start)();
    int (*resume)();
    int (*play_1x)();
}PLAYER;

int main()
{
    PLAYER player;
#define SET(x) \
    printf("set %s\n", #x); \
    player.x = player##x
#define SSET(x) \
    SET(x)

    //SET(stop);
    /*注意下面這行語句*/
    SSET(FUNC_STOP);
    SET(start);
    SET(resume);
    SET(play_1x);

    printf("%d %d %d %d\n", player.stop(), 
    player.start(), player.resume(), player.play_1x()); 
    return ;
}
           

繼續閱讀