通過命令列cl.exe編譯Windows程式--預編譯跟蹤巨集定義
阿新 • • 發佈:2019-01-31
編寫C、C++程式的時候,使用各種巨集定義是非常常見的。但是比較蛋疼的首先就是巨集定義有副作用,並且副作用有時候我們還不容易發現。其次就是使用巨集定義函式片段,特別是比較長函式片段的時候,直接檢視vs 2008的編譯錯誤提示,很多時候根本就沒有辦法一眼看出哪裡出錯,會花費比較長的時間。這時候,cl.exe的作用就來了,我們直接通過cl.exe進行預編譯,即不生成obj檔案,然後檢視C、C++巨集替換之後的預編譯程式碼,這樣,非常容易就找出巨集定義的副作用或者巨集定義錯誤。
測試的環境和執行的步驟仍然是通過cmd命令列,具體可以參考我的另外一篇<<一步步通過命令列cl.exe編譯Windows程式>>。
編寫測試的main.c如下(編寫的巨集只是簡單測試使用):
#include <stdio.h>
#define ADD(a,b) a+b
#define Fun(a,b) if(a>b) \
c++\
a++\
int main(int argc,char* argv[])
{
int c = ADD(2,3);
int d = ADD(c++,2>3);
Fun(c,d);
printf("This is a test program\r\n");
return 0;
}
直接編譯會報錯,而且錯誤的具體地方不大明顯:
使用 /E 選項,執行預編譯,指定生成 main.i 檔案。
開啟main.i檔案,預編譯後的檔案由於會拷貝標頭檔案的內容,以及進行巨集替換,行重定向等,會發現main.i的內容是非常非常長的。不過直接搜尋 main 關鍵字,跳轉到檔案main.i的末尾即可查到到main函式。
#pragma pack(pop) #line 738 "../include\\stdio.h" #line 740 "../include\\stdio.h" #line 2 "src/main.c" int main(int argc,char* argv[]) { int c = 2+3; int d = c+++2>3; if(c>d) c++ c++; printf("This is a test program\r\n"); return 0; }
如上圖,經過巨集替換之後的函式,我們很容易就可以看到巨集替換的副作用語句 int d = c+++2>3; 同時 看到語法錯誤的語句 if(c>d) c++ c++; 這樣我們 基本就可以看到應該如何修改我們的巨集定義了。