2012-04-27 75 views
1

使用pycparser解析一大堆.c源文件,但解析器無法在#included庫中處理很多事情,而且我真的不需要它們來達到我的目的。我不需要編譯它,只需要從正在處理的具體.c生成AST。 CPP的ARGS我傳遞它現在是:任何讓c預處理器忽略所有#include的方法?

cpp_args=["-D__attribute__=","-D__extension__=","-D__builtin_va_list=void*"] 

任何想法?

謝謝!

+2

'#ifdef來USE_INCLUDES'吧? – 2012-04-27 15:56:49

回答

4

嘗試指定-nostdinc選項預處理器(並確保你沒有傳遞任何-I選項)。鑑於這種輸入foo.c

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

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

運行:

cpp -nostdinc foo.c 

給我:

# 1 "foo.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "foo.c" 




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

與以下錯誤:

foo.c:1:19: error: no include path in which to search for stdio.h 
foo.c:2:20: error: no include path in which to search for stdlib.h 
foo.c:3:20: error: no include path in which to search for unistd.h 
+0

這會抓住#include 之類的嗎? – Chris 2012-04-27 16:07:11

+0

這看起來就像我的示例中現有的'#include'行,所以可能... – larsks 2012-04-27 17:12:31

+0

如果錯誤是一個問題,只需使用一個'-I'選項指向一個包含大量空文件的目錄用適當的名字。 – 2012-04-27 17:16:28

0

一個解決方案是使用的#include衛士

如果你有傳統的包裝中的每個標題,例如。

#ifndef THIS_FILE_H 
#define THIS_FILE_H 

    // stuff 

#endif 

然後,你可以你想簡單地#define所有的頭文件保護標籤忽略

+0

你能多解釋一下還是舉個例子?我不太清楚如何應用你所說的話。我有很多.c文件,它們的編寫方式非常廣泛,我需要這樣做。謝謝您的幫助! – Chris 2012-04-27 16:05:13