簡體   English   中英

在沒有預處理器的情況下展開C / C ++函數宏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM