[英]Expand C/C++ function macros without preprocessor
如何在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 <>”輸出真的很難看,我只想要幾個簡單的宏擴展而沒有所有的開銷。
不,這是不可能的。 例如,您包含的標題可能包含要在正文中展開的宏。 或者你的意思是不擴展來自標題的任何宏? 在這種情況下,預處理器絕對無法區分您想要的內容和您不想要的內容。
如果您事先知道情況並非如此,那么我建議您只需編寫一個腳本來刪除包含,然后通過預處理器運行它。
我聽到了有關該主題的所有可能的否定答案:
它們都是真的,但IMO卻與日常編程的現實相沖突。
事實上,在處理宏C項目的舊C項目中,這對於我來說至關重要。 使用/ P生成所有預處理文件但是過度使用和耗時。 我只需要一個工具來擴展一個簡單的宏,在其他文件中定義幾行或最多。
怎么做?
1 Onl,inux只需使用GDB和他的擴展宏功能2在Windows上我使用https://www.jetbrains.com/resharper-cpp/集成到Visual Studio中
所以,是的,從實際意義上講,它是可能的。
保護#include
不被擴展,以文本方式運行預處理器,刪除文本預處理器生成的# 1 "<stdint>"
等垃圾並# 1 "<stdint>"
受保護的#include
。
這個shell命令執行它:
sed 's|^\([ \t]*#[ \t]*include\)|magic_fjdsa9f8j932j9\1|' | cpp | \
sed 's|^magic_fjdsa9f8j932j9||; /^# [0-9]/d'
只要你把包含的詞放在一起而不是做瘋狂的狗屎就好
#i\
ncl\
u??/
de <iostream>
(上面你可以看到2個反斜杠延續線+ 1個三字形(?? / == \\)反斜杠延續線)。
如果你願意,你可以用同樣的方式保護#if
s #ifdef
s #ifndef
s #endif
s和#else
s。
假設您要查看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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.