2010-04-11 88 views
13

有沒有辦法運行GCC預處理器,但只能用於用戶定義的宏?爲GCC運行「輕」預處理器

我有幾個單行程序和一些#ifdef等條件,我想看看我的代碼在擴展時看起來像什麼。

正因爲如此,在包括得到擴展,輪到我fprintf(stderr) s轉換fprintf(((__getreeent())->_stderr)等直接

回答

14

呼叫cpp,例如

$ cat >foo.c <<EOF 
#define FOO 
#ifdef FOO 
foo is defined 
#else 
foo is not defined 
#endif 
EOF 

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


foo is defined 

當然,如果您包含任何標題,那麼這些標題將包含在輸出中。避免這種情況的一種方法可能是將grep -v#include s(或者可能只是#include <和允許#include ")一致。或者,您可以指定-nostdinc選項來刪除標準包含(但可能會保留在本地庫中,除非您指定include路徑以便它們不會被找到),但這會警告丟失標頭。

編輯:或者使用預處理器本身來包含有條件的頭文件,將它們包裝在類似#ifndef TESTING_PREPROCESSOR之類的文件中並使用-DTESTING_PREPROCESSOR

+2

1 - 尖端用於使'#include'線在'#if'部分是那些簡單而有效的事情之一可能不會出現某人,直到其他一些努力浪費在嘗試其他更復雜的事情上。 – 2010-04-11 04:56:40

3
cpp -nostdinc program.c 
1
gcc -E inputfile.c > outputfile.c 

outputfile.c將有你的預處理代碼,但所有宏將擴大。

我發現這個技巧在調試編譯包含大量include,編譯器標誌和makefile變量的大型系統時非常有用。它會暴露包含沒有標頭警衛的文件,以及其他一些問題。

+1

這不就是運行預處理器的標準方式嗎?這是如何回答這個問題的?據推測,OP想要一個非標準的行爲(?)。 – 2014-10-13 16:55:24

+0

這是標準的方式。如果您的程序在用戶定義的宏上非常繁重,並且在非用戶定義的宏上點亮,那麼用戶定義的宏將很容易被識別出來。通過運行inputfile.c和outputfile.c的diff。在許多情況下,gcc -E已經足夠好了,儘管在檢測「唯一」用戶定義的宏時非常完美。而且比使用其他答案中描述的完美方法要快得多。 – 2016-07-07 02:51:05

2

一個可使用工具,如unifdef,unifdefall - 刪除從代碼

預處理條件