2012-10-30 30 views
1

我有一個源文件foo.c和一個頭文件bar.h。我怎樣才能擴展macrosbar.h而不擴展其他頭文件macros根據指定的頭文件在C中擴展宏

$ cat foo.c 

#include <stdio.h> 
#include "bar.h" 

int main() 
{ 
#ifdef BAR_FUNC 
    printf("bar func\n"); 
#else 
    printf("foo func\n"); 
#endif 
    return 0; 
} 

$ cat bar.h 

#define BAR_FUNC 1 

我要的是:

$ EXPAND_MAGIC foo.c 

#include <stdio.h> 

int main() 
{ 
    printf("bar func\n"); 
    return 0; 
} 

如果我使用`gcc -E,它擴展<stdio.h>爲好。但我只想擴展宏bar.h。 gcc中有這樣一個選項嗎?如果沒有,有沒有其他工具可以做這樣的預處理?

更新:超過foo.c/bar.h只是一個例子。實際上,我在bar.h中定義了幾百個宏(請考慮由autoconf在相當大的項目中生成的config.h)。我想要的是在10K以上的源文件中擴展所有這些宏(和ONLY)。有什麼建議麼?

+0

使用-D選項,例如-Dmacro = [defn] ..do man gcc並搜索此預處理器選項 – Omkant

+0

@Omkant我在bar.h中定義了數百個宏。所以-D不是一種選擇。另外我想要的更像是文本處理,而gcc -D將編譯源代碼。 – Bergwolf

回答

1

你可能會考慮這是在答覆中提到,以this question程序sunifdef。它允許您在命令行上指定宏定義,並適當地消除#ifdef行。請注意,它不會執行宏擴展。這就是說,你不應該使用像這樣的工具來進行一般的開發,但是它對於解碼或清理一個已經被許多未使用的#ifdefs的多年來變得混亂的代碼是非常有用的。

+0

已下載的sunidef及其繼任者[coan](http://coan2.sourceforge.net/index.php)。兩者都爲我完美工作。非常感謝! – Bergwolf

0

您可以使用像eclipse這樣的IDE。它會禁用未編譯的代碼部分。您可能無法正確看到您想看到的內容,但您可以看到禁用的代碼和正常代碼之間的明顯區別。如果您沒有使用GUI的優點,請忽略此選項。

Eclipse還有助於expanding macros當你有複雜的宏可以非常方便的。

+0

@grhedge,謝謝你推薦eclipse ......但是正如你猜測的那樣,我不能使用GUI,我想要做真正的文本處理,而不是僅僅在GUI中顯示擴展宏而不改變代碼。 – Bergwolf

1

不幸的是,proeprocessos是全有或全無。要麼運行它,它包括所有請求的文件並展開所有宏。

但是你可以種解決它通過使用預處理器的條件編譯功能:

#ifndef INCLUDE_ONLY_BAR 
# include <stdio.h> 
#endif 
#include "bar.h" 

int main() 
{ 
#ifdef BAR_FUNC 
    printf("bar func\n"); 
#else 
    printf("foo func\n"); 
#endif 
    return 0; 
} 

你可以「編譯」它是這樣:

$ gcc -E -DINCLUDE_ONLY_BAR foo.c 
0

嘗試:
常編譯:gcc -include stdio.h -imacros bar.h foo.c
編譯擴大ONLY宏在bar.h:gcc -E -imacros bar.h foo.c

+0

gcc -E -imacros仍然爲我擴展了其他頭文件。 – Bergwolf

+0

我的意思是,不要直接包含stdio.h。使用-include開關將其包含在命令行中。 – anishsane