1. 程式人生 > >[原創]使用Visual Studio .NET編寫純C程式的提示

[原創]使用Visual Studio .NET編寫純C程式的提示

作者:lover_P

所謂的純C程式,是指該程式(包括可執行程式或庫)之原始碼所用語法嚴格遵守C89標準,且所用之庫函式,要麼為C89標準所支援之標準庫函式,要麼為第三方以純C程式所編寫之庫函式。

上面是我對“純C程式”做的一個非標準的、遞迴的定義。

使用Visual Studio的朋友們都知道,作為Visual Studio套件的Visual C++整合開發環境並沒有提供C語言編譯器,我們只能使用C++編譯器對C程式進行編譯。儘管Eckel Bruce認為,用C++編譯器來編譯C程式可以發現程式中隱含的可能的錯誤(參見《Think in C++》),但我堅持認為這不是一個好辦法:這隻會讓大家寫出那些運用了大量C++特性的C程式。這種程式是不可取的。Bjnare Stroustrup也認為,C++應當是一門獨立於C語言的、全新的程式設計語言;而我卻覺得,C應該是獨立於C++的、老樹常青的語言。因此,我們需要一個能夠編寫純C程式的開發環境和編譯器。

Visual Studio .NET中的C++編譯器為我們提供了這樣功能!Visual Studio .NET中的C++編譯器不僅大大加強了對C++標準的支援,通過一些配置,還可以對純C程式進行編譯!在本文中我將對其配製方法進行一個簡要的介紹,希望能夠對那些喜歡純C程式設計的朋友們有所幫助。也希望初學C語言程式設計的朋友能夠寫出漂亮的C程式。

整合開發環境的配置

首先,在建立專案的時候,選擇Win32控制檯應用程式即可,但一定要選擇“空專案”選項。這樣就能防止Visual Studio嚮導為我們產生不必要的原始檔(程式碼)和設定一些不必要的編譯器選項。具體操作方法見如下圖示:

選擇“檔案”-〉“新建”-〉“專案”:

在“新建專案”對話方塊中,在“專案型別”李表框中選擇“Visual C++專案”,並在“模板”列表框中選擇“Win32 控制專案”模板。別忘了在“名稱”文字框中輸入專案的名稱,這裡我起名為“PureC”:

點選“確定”按鈕後,將彈出“Win32 應用程式嚮導”對話方塊,別急著點“確定”:

最初,在我看到這個對話方塊的時候,還真沒注意過“應用程式設定”這個選項(可能是我太笨了罷-_-b)。因此,我們要:

點選“應用程式設定”選項卡,選中“附加選項”中的“空專案”:

這一步是問題的關鍵。如果我們沒有選擇“空專案”,Visual Studio .NET的嚮導會為我們新增一些支援用於支援Windows應用程式的原始檔(如“stdafx.h”、“stdafx.c”等),而且還會對編譯器進行一些設定。儘管這些設定對於編寫Windows API程式非常有用,但對於我們編寫純C程式來講,是非常不利的。因此,我們有必要選擇“空專案”。

點選“確定”按鈕後,我們便得到了一個空的專案,觀察一下“解決方案資源管理器”列表框,我們發現,已經沒有了嚮導為我們產生的煩人的多餘的原始檔了。這時,我們需要手動地將我們的原始檔新增到專案中。在這裡我們新增一個新的原始檔“PureC.c”。在“解決方案資源管理器”列表框中的“原始檔”資料夾圖表上單擊右鍵,選擇“新增”-〉“新增新項”:

在彈出的“新增新項”對話方塊中,選擇“C++ 檔案”即可。並在“名稱”文字框中輸入原始檔的名稱。注意,必須在檔名中寫明副檔名“.c”,否則IDE將自動為該檔案新增“.cpp”副檔名:

接下來,我們要設定一下專案的屬性。在“解決方案資源管理器”的專案(這裡是“PureC”)上單擊右鍵,在彈出選單中選擇“屬性”。將彈出“屬性頁”對話方塊。在左側的樹狀檢視中展開“C/C++”節點,選擇“高階”節點;在右側出現的列表框中,將“編譯為”列表項改為“編譯為 C 程式碼(/TC)”:

點選“確定”按鈕,OK,大功告成了。

控制檯選項的配置

這個題目有點……那個……了。我的直觀感覺就是用控制檯命令列編譯程式的人應該都是蝦(就算不是大蝦,也得是個小蝦),對於命令列的選項應該是瞭解的很了。我也就不過多獻醜了,簡單而言,只要在命令列中新增/TC選項,就可以把一個原始檔編譯為純C程式碼。

測試

經過這樣一番調教,我們中有了一個能夠編寫純C程式碼的環境了。空口無憑,我們得用一段程式驗證一下。為我們的PureC.c新增如下一段程式碼:

/*
* Model: PureC.c
* Author: lover_P
* Date: 2004-6-3
*
* Test the pure C envirment in VS.NET
*/

struct A {
int i;
};

int main() {
A a;
a.i = 10;
}
/* end */

這段程式碼對於C++程式來說是完全正確的,完全可以通過編譯且沒有錯誤和警告。但這並不是“純C程式”,因為在C標準中,當以結構型別作為變數型別時,在變數的宣告語句中必須顯式地出現struct關鍵字。因此,在我們這個“純C環境中”編譯這段程式碼,將會得到N多錯誤報告。

因此,我們要把main()函式的第一行改為純C形式的宣告語句:

struct A a;

這樣,再次編譯,將是0錯誤0警告。

總結

最後,這個“純C環境”只是輔助性的,要想學會編寫“純C程式”,首先要仔細學習標準C語言。不要指望這個環境能教會你寫“純C程式”,就像上面的例子,僅僅缺少一個關鍵字,在Visual Studio .NET 2003種將會得到這麼多錯誤:

e:\Workspace\C++\PureC\PureC.c(14): error C2065: “A” : 未宣告的識別符號
e:\Workspace\C++\PureC\PureC.c(14): error C2146: 語法錯誤 : 缺少“;”(在識別符號“a”的前面)
e:\Workspace\C++\PureC\PureC.c(14): error C2144: 語法錯誤 : “<未知>”的前面應有“<未知>”
e:\Workspace\C++\PureC\PureC.c(14): error C2144: 語法錯誤 : “<未知>”的前面應有“<未知>”
e:\Workspace\C++\PureC\PureC.c(14): error C2143: 語法錯誤 : 缺少“;”(在“識別符號”的前面)
e:\Workspace\C++\PureC\PureC.c(14): error C2065: “a” : 未宣告的識別符號
e:\Workspace\C++\PureC\PureC.c(15): error C2224: “.i”的左側必須具有結構/聯合型別

如果你對標準C不是很瞭解的話,面對這麼多錯誤肯定是無從下手的。因此,語言的學習是很重要的,環境只是一個輔助的功能。

最後,祝大家能夠學好這門最NB的語言。