1. 程式人生 > >通過命令列cl.exe編譯Windows程式--預編譯跟蹤巨集定義

通過命令列cl.exe編譯Windows程式--預編譯跟蹤巨集定義

     編寫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++;  這樣我們 基本就可以看到應該如何修改我們的巨集定義了。