1. 程式人生 > >c語言 巨集替換的順序

c語言 巨集替換的順序

巨集替換順序,這是以前在論壇裡看到的一個問題,因此整理下來供自己學習和參考,測試程式hello.c:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
  
#define _ToStr(x) #x 
#define __ToStr(x) _ToStr(x) 
#define Japan_EarthQuake 9.0 
  
int main() 
{ 
    printf("_ToStr:%s\n",_ToStr(Japan_EarthQuake); 
    printf("__ToStr():%s\n",__ToStr(Japan_EarthQuake); 
    return 0; 
}

在mingw下編譯得到hello.out,執行後得到結果如下:

定義兩層的原因是(傳入的引數可能是巨集也可能是普通字串):

(1)預處理順序:總是先將" "內的東西識別為字串,再進行巨集替換或巨集引數替換,即" "內的巨集名或巨集引數名不被替換。

(2)#用來給巨集引數加引號。對於將表示式轉化為包含這個表示式的字串的需求,可將這個表示式定義成巨集的引數exp,在巨集內部用#exp來給表示式加引號。

(3)巨集替換順序:一個巨集的引數是另一個巨集,先替換外面的巨集,後替換引數。因此#define _ToStr(x) #x以後_ToStr(a+b)相當於"a+b",而#define X a+b 再_ToStr(X)的結果相當於"X"——先替換外面的巨集,給X加了引號,再替換裡面的巨集,對" "內的巨集名不替換。

(4)巨集替換順序:一個帶引數的巨集內部呼叫另一個巨集,引數也是一個巨集,則先替換外層的巨集,再替換外層巨集的引數,最後替換內層巨集。因此採用兩層轉換之後,外邊的巨集先被替換了,但沒有完全展開,然後引數被替換了(保證引數是巨集時被展開),最後外邊的巨集展開。