2012-06-11 27 views
1

我想寫一個C程序來實現預處理器的include功能。包含c中的預處理器的實現

實施例:

在header.h我有這樣的代碼:

char *test (void); 

而在program.c:

int x; 
#include "header.h" 
int 
main (void) 
{ 
    puts (test()); 
} 

輸入是program.c

輸出必須是:

int x; 
char *test (void); 
int 
main (void) 
{ 
    puts (test()); 
} 

我怎樣才能做到這一點?

+0

你在哪裏定義了test()? – nischayn22

+0

在header.h中我定義了test()。 – AComputer

+1

實現最小預處理器應該相當容易。如果您好奇,可以在Sourceforge上查看[mcpp](http://mcpp.sourceforge.net)或[Gnu cpplib](http://gcc.gnu.org/projects/cpplib.html ) – paulsm4

回答

0

您需要逐行讀取輸入文件。檢查該行是否以#include開頭(帶有可選的前導空格)。如果沒有,請打印您閱讀過的一行。如果是這樣,請改爲打開指定的文件,並在其上運行相同的算法(以處理輔助#includes)。

+0

我該怎麼做? – AComputer

+0

@AComputert打開一個文件,逐行讀取它,跟蹤註釋和字符串,所以你不要試圖處理'printf(「#include \ n」);''或註釋'/ * #include * /'。或者把它全部讀入內存並瀏覽一遍;或者使用'mmap()'使其在內存中可用。或者... –

+0

也想到遞歸。 –

0

你可以運行gcc -E「你的源文件」,然後過濾包含「#」的行,左邊是你想要的,而宏由其真實形式替換。

例如:

gcc -E hello.c|sed '/# .,$/d' > a.c 

交流轉換器是你想要的文件。

0

當使用gcc
GCC -E -P program.c


CPP -P program.c

當利用Visual C
CL/EP程序。 c