2012-12-18 43 views
1

我正在使用gnu cpp進行一些測試,並希望它保留宏並同時擴展其他用戶定義的宏。可能嗎? 下面是一段代碼(文件foo.c)的:是否可以讓gnu cpp保存包含宏?

#include <stdio.h> 
#define NEWLINE(str) str "\n" 
int main(){ 
    puts(NEWLINE("foo")); 
} 

我希望的cpp foo.c的結果是:

#include <stdio.h> 
int main(){ 
    puts("foo\n"); 
} 
+2

你能舉個例子嗎? – NPE

+0

你爲什麼要問?你可以在某個給定點之後複製粘貼預處理過的輸出(例如,在最後一個'#include'後面),但即使這樣也不是很明智:你不想在'((void *)-1)'中讀取'MAP_FAILED'你的源代碼.... –

回答

0

如果我正確理解你,你想使用預處理器只預處理某些部分,但不預處理其他部分。這通常是不可能的。做到這一點的唯一方法是向來源添加條件,即使用例如#ifdef#endif圍繞您要擴展的部分,並將命令行上的定義傳遞給預處理器。

+0

所以我必須讓'cpp gnu'先忽略那些_#define_宏併爲其他人預處理? –

+0

@HongxuChen不,您必須使用[條件編譯](http://en.wikipedia.org/wiki/Conditional_compilation)技術來告訴預處理程序應該預處理哪部分以及哪部分不應該處理。 –

+0

懂了!我知道我現在可以做什麼,雖然要求有點不同:-) –

0

不,這是不可能的。但是,預處理器輸出中的行信息通常以#開頭的行提供。

您可以使用其他一些預處理器,例如, gpp

1

您可以使用腳本將每個#include註釋掉,運行cpp,然後刪除這些註釋。

+0

它可能不像通緝那樣行事。想象一下,第一個包含的頭文件'#define' - 其中包含的頭文件會用'#ifdef'測試(這是一個常見的情況,通常是隱藏的) –

+0

你是對的,但如果我理解了正確的話@Hongxu Chen want頭文件中的'#define'不必應用在這個文件之外。 –

相關問題