2016-08-08 170 views
0

我只是遵循了一個教程,其中涉及在程序中執行CPP宏來實現調試系統。宏的一個偉大的行爲是遞歸的,從而能夠把宏觀另一個宏裏面象下面這樣:C預處理器宏命令

#define MACRO1 "World" 
#define MACRO2 printf("Hello %s\n",MACRO1); 
#include<stdio.h> 
#include<stdlib.h> 

int main(int argc, char *argv[]){ 
    MACRO2 
    return 0; 
} 

輸出:Hello World

下面也似乎工作:

#define MACRO2 printf("Hello %s\n",MACRO1); 
#define MACRO1 "World" 
#include<stdio.h> 
#include<stdlib.h> 

int main(int argc, char *argv[]){ 
    MACRO2 
    return 0; 
} 

因此,爲了理解,CPP是否首先讀取所有#define X以製作已聲明宏的列表,然後替換其他宏中的宏,避免預處理中的「雞和蛋」問題?

我認爲這是有道理的,考慮到預處理是一個只有一次的過程(編譯期間),不是實時發生的。因此,在代碼中定義宏的位置應該沒有關係,但實際上如果它是定義的。

有一個3000行代碼,只有在最後一行定義代碼中使用的宏將是有效的嗎?

預先感謝您!

+0

C預處理程序可能有多少次通過?(http://stackoverflow.com/questions/13442028/how-many-passes-does-the-c-preprocessor-make) –

回答

1

實際情況是,遞歸替換隻在使用宏時發生,而不是在定義時發生。

因此,在

#define MACRO2 printf("Hello %s\n",MACRO1); 

預處理器只是記住這MACRO2擴大爲7個令牌printf("Hello %s\n",MACRO1);。在這一點上,它並不關心哪些令牌是宏。

在點在哪裏main你做

MACRO2 

預處理器的宏展開那七代幣,然後將檢查令牌流是否包含任何更多的宏可以被再次擴大。它通知MACRO1並替換令牌"World"。此時它再次檢查,但沒有更多的宏用於擴展。

如果您在嘗試使用宏之前就會遇到問題#define d。