巨集定義

weixin_34208185發表於2018-06-26

巨集定義

名稱:預處理拼接符,或者稱其為巨集拼接符
作用:用於類似函式的巨集的替換部分,還可以用於類似物件的巨集的替換部分。

放在巨集的替換部分的前面,用於巨集展開(即巨集替換)後,立即將巨集中位於##右邊的巨集替換部分與該巨集中位於##左邊的部分相拼接至一個整體。

例子:

'' #define jni(NAME) com_dm_jni_##NAME();// jni(wineout)會呼叫com_dm_jni_wineout()

#

作用:巨集展開(即巨集替換)後,#可以立即把其後的巨集替換部分原封不動地進行字串化.
例子:
#define TEST(x) printf("square of " #x " is %d.\n",(x)*(x))

#include <stdio.h>
#define TEST(x) printf("square of " #x " is %d.\n",(x)*(x))
void main() {
    int y =4;
    // #x被替換成字串"y"    
    TEST(y); 
    // printf("square of " "y" " is %d.\n",(y)*(y))
    // #x被替換成字串"6-3" 
    TEST(6-3); 
    // printf("square of " "6-3" " is %d.\n",(6-3)*(6-3))
    // #x被替換成字串"y+3" 
    TEST(y+3); 
    // printf("square of " "y+3" " is %d.\n",(y+3)*(y+3)) 
}

輸出結果:
square of y is 16. square of 6-3 is 9. square of y+3 is 49.

有關...、VA_ARGS和##VA_ARGS的講解請看:
http://www.cnblogs.com/alexshi/archive/2012/03/09/2388453.html
VA_ARGS的前面加上##是為了用來支援出現0個可變引數的情況。

例子:
#define LOG(FORMAT,...) printf(##FORMAT,VA_ARGS);
我們就可以這樣列印 LOG("%s%d","str",89);

相關文章