2015-03-08 62 views
7

如何在C/C++文件中測試/展開所有函數宏而不通過預處理器運行它? 例如,有一個程序或方法這將改變此:在沒有預處理器的情況下展開C/C++函數宏

#include <iostream> 
#define AAA(a) cout << "function " << a << endl 
using namespace std; 
int main(){ 
AAA(12); 
} 

到這個?

#include <iostream> 
using namespace std; 
int main(){ 
cout << "function " << 12 << endl; 
} 

我不想通過預處理程序運行,因爲在文件中的所有包括使「GCC-E <>」輸出真難看,我只想沒有所有的開銷幾個簡單的宏展開。

+3

你可能會寫一些使用clang作爲庫的代碼,並使用它的預處理器。除非'grep -v^\#include myfile | gcc -E'對你來說已經足夠了。 – 2015-03-08 22:16:01

+0

Resharper for C++可以讓你做到這一點。 – chris 2015-03-08 22:19:26

+0

感謝您的建議,我會考慮叮噹。但是,它將迭代超過33k +代碼行,所以我認爲grep會變得有點骯髒。我現在在Mac上,但我會跳到虛擬機上,給Resharper一個鏡頭。 – Involution 2015-03-08 22:23:18

回答

-1

假設你想看到file.c.如果它包含main函數,則需要更改該函數的名稱才能使用。以下內容將文件打印到標準輸出,只有中等附加的醜陋。

#include "file.c" 
#include <stdio.h> 

#define X(...) #__VA_ARGS__ 

void print_file(char* s) 
{ 
    // a loop here to move through s until some identifier is found 
    // in the original file, say a comment that says: //___START___HERE___ 
    while(*s){ 
     if(*s=='{' | *s=='}' | *s=='#') printf("\n"); 
     printf("%c",*s); 
     if(*s==';') printf("\n"); 
     } 
} 

int main(int argc, char* argv[]) 
{ 
    print_file(X(
    #include "file.c" 
    )); 
    return 0; 
} 
+0

這將打印所有包含在文件中。 – Puppy 2016-03-25 11:18:32

+0

@Puppy,這是一個非常小的問題。直到找到主要名稱改爲或某些設置註釋或其他內容後,纔打印它。這就像2行額外的代碼。 – Kyle 2016-03-25 11:19:58

+0

正確解析C++代碼並不是微不足道的。 – Puppy 2016-03-25 11:23:28

2

不,這是不可能的。例如,您包含的頭文件可能包含您要在正文中展開的宏。還是你的意思是不擴展任何來自頭文件的宏?在這種情況下,預處理器絕對沒有辦法區分你想要的和你不想要的。

如果您事先知道情況並非如此,那麼我建議您只需編寫一個腳本來刪除includes,然後通過預處理器運行該腳本。

1

我聽到主題的所有可能的否定回答:

  • 宏只能擴大不能評估
  • 處理器也應解析包含文件
  • 嵌套宏可能被過度複雜
  • 條件預處理可能會很棘手
  • 宏是邪惡只是避免它們
  • 等 etc ....

他們都是真實的,但IMO他們與每天編程的現實相沖突。實際上,在處理宏C被用作函數的舊C項目中,這對我來說非常重要。使用/ P生成所有預處理文件的工作原理,但過度使用和花費時間。我只需要一個工具來擴展在其他文件中定義的幾行或最多一行的簡單宏。

如何做到這一點?

1 ONL,inux下只需使用GDB和他展開宏功能 2在我使用https://www.jetbrains.com/resharper-cpp/集成到Visual Studio窗口

所以,是的,在實際意義上,它是可能的。