C語言預編譯的例子
㈠ 初學c語言時,輸入程序後運行,是執行還是預編譯預編譯是什麼為什麼最開始要有#include如
預編譯是把一個工程中較穩定的代碼預先編譯好放在一個文件里.這些預先編譯好的代碼可以是任何的C/C++代碼。而輸入程序後的運行,只是將代碼編譯成了obj(object)文件,所有obj文件經鏈接(link)成為可執行文件。而你說的執行,應該就是點擊最後生成的.exe文件了。開始要有的#include,是表明要包含的頭文件,或者其它的保存的代碼文件。只有這樣,你才可以引用到那個文件中的代碼,來供目前的文件來使用。
至於你說的什麼大型游戲的編程,應該也是這樣的一套,因為C語言就是上述生成文件的套路。游戲的編程,初學的話可以建議看《游戲編程入門》( 美 哈本),這本書基於windows平台,是為幾乎沒有游戲開發經驗的初學者寫的,循序漸進,從2D講到3D 的一些基本技術,其中的例子也非常經典,看完書基本就可以做出不錯的2D 游戲了,也有了一定的3D基礎了,之後再看一些深入的書籍像《Windows游戲編程大師技巧》。
㈡ c語言編譯預處理
編譯,編譯程序讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,並且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。
如果用一張圖來表示:
讀取c源程序,對其中的偽指令(以#開頭的指令)和特殊符號進行處理
[析] 偽指令主要包括以下四個方面
(1)宏定義指令,如#define Name TokenString,#undef等。對於前一個偽指令,預編譯所要做的是將程序中的所有Name用TokenString替換,但作為字元串常量的Name則不被替換。對於後者,則將取消對某個宏的定義,使以後該串的'出現不再被替換。
(2)條件編譯指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉
(3)頭文件包含指令,如#include "FileName"或者#include 等。在頭文件中一般用偽指令#define定義了大量的宏(最常見的是字元常量),同時包含有各種外部符號的聲明。採用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。
包含到c源程序中的頭文件可以是系統提供的,這些頭文件一般被放在/usr/include目錄下。在程序中#include它們要使用尖括弧(<>)。另外開發人員也可以定義自己的頭文件,這些文件一般與c源程序放在同一目錄下,此時在#include中要用雙引號("")。
(4)特殊符號,預編譯程序可以識別一些特殊的符號。例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。
注意:
預編譯程序所完成的基本上是對源程序的「替代」工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。
㈢ c語言中「宏」是個什麼東西 有什麼意義
宏定義的作用在預編譯階段,形如 #define A B 就是宏定義了,作用就是在預編譯階段將程序中的A全部視為B,舉個例子:
我們在程序最開始,聲明如下宏定義
#define pi 3.1415926
那麼在我們寫程序的時候,我們可以直接使用pi作為一個常量來使用,那麼當我們編譯程序的時候,編譯器會自動將程序中出現的pi替換成3.1415926
第二個例子,利用宏定義定義傻瓜函數
#define mul(A,B) A*B
那麼我們可以將mul()在程序中當成函數來使用,為什麼叫做傻瓜函數一會來解釋,使用方法
mul(3,5) 那麼這段代碼就相當於計算3*5=15
那麼當我們如下使用時就會出現問題
mul(3+2,3) 我們期待的結果是15,而實際結果是9,為什麼呢?因為在程序會如下轉換
3+2*3=3+6=9 這也就是為什麼我們管宏定義出來的函數叫傻瓜函數的原因了~~~
樓主呀~~~完全手寫,一定要好評呀!^_^
㈣ c語言的標識符
C語言的標識符主要分為以下三類:
關鍵字:
- 定義:關鍵字是C語言程序中的固定詞彙,用於表示特定功能和用途。
- 特點:不允許用作用戶自定義標識符,以避免混淆和沖突。
- 示例:if、else、while等,它們構成了C語言的基礎結構,如條件判斷、循環控制等。
預定義標識符:
- 定義:預定義標識符代表了C語言的庫函數名稱或預編譯處理命令。
- 特點:這些標識符是所有C程序共同使用的符號,為程序員提供了豐富的功能和便利的編程工具。
- 示例:庫函數名如printf、scanf、malloc等,預編譯處理命令名如#include、#define等。
用戶標識符:
- 定義:用戶標識符是程序員自定義的名稱,用於表示變數、函數、類型等。
- 組成規則:由字母、數字和下劃線組成,但第一個字元必須為字母。
- 大小寫敏感性:字母的大小寫在C語言中具有重要意義,不同的大小寫表示不同的標識符。例如,User和user是兩個完全不同的標識符。
總結:C語言的標識符系統為程序設計提供了堅實的基礎,關鍵字、預定義標識符和用戶標識符各司其職,共同構建了C語言的標識符體系。理解這些標識符的分類和使用規則對於編寫高效、可讀性強的C程序至關重要。
㈤ VC棰勫勭悊鎸囦護涓庡畯瀹氫箟鐨勫欑敤
銆銆鍒氭帴瑙﹀埌MFC緙栫▼鐨勪漢寰寰浼氳玀FC 鍚戝肩敓鎴愮殑鍚勭嶅畯瀹氫箟鍜岄勫勭悊鎸囦護鎵鍚撳 浣嗘槸棰勫勭悊鍜屽畯瀹氫箟鍙堟槸C璇璦鐨勪竴涓寮哄ぇ宸ュ叿 浣跨敤瀹冧滑鍙浠ヨ繘琛岀畝鍗曠殑婧愪唬鐮佹帶鍒 鐗堟湰鎺у埗 棰勮︽垨鑰呭畬鎴愪竴浜涚壒孌婄殑鍔熻兘
銆銆 涓涓緇忓吀鐨勪緥瀛
銆銆浣跨敤棰勫勭悊涓庡畯瀹氫箟鏈緇忓吀鐨勪緥瀛愯帿榪囦簬鍔犲湪涓涓澶存枃浠朵腑浠ラ伩鍏嶅ご鏂囦歡琚涓ゆ$紪璇 璇曟兂榪欑嶇殑鎯呭喌 鏈変竴涓鏂囦歡headerfile h 瀹冭鍖呭惈鍦╤eaderfile h涓 鍚屾椂鍦╤eaderfile h 涓涔熻鍖呭惈浜 鐜板湪鏈変竴涓狢PP鏂囦歡 implement cpp 鍖呭惈浜唄eaderfile h 鍜宧eaderfile h
銆銆#include headerfile h
銆銆#include headerfile h
銆銆鍋囪緃eaderfile h 涓瀹氫箟浜嗕竴涓鍏ㄥ矓鍙橀噺 iglobal
銆銆int iglobal
銆銆鍦ㄧ紪璇戠殑鏃跺欑紪璇戝櫒涓ゆ$紪璇慼eaderfile 涔熷氨浼氬彂鐜癷global琚瀹氫箟浜嗕袱嬈 榪欐椂灝變細鍙戠敓鍙橀噺閲嶅畾涔夌殑緙栬瘧閿欒
銆銆浼犵粺鐨勮В鍐沖姙娉曟槸浣跨敤#ifdef 浠ュ強#endif 鏉ラ伩鍏嶅ご鏂囦歡鐨勯噸澶嶇紪璇 鍦ㄤ笂闈㈢殑渚嬪瓙涓 鍙闇瑕佸姞涓婅繖涔堝嚑琛
銆銆#ifndef *** artnose_ _ _ _headerfile_h
銆銆#define *** artnose_ _ _ _headerfile_h
銆銆int iglobal
銆銆#endif
銆銆浠旂粏鐨勮冭檻涓婇潰鐨勫畯瀹氫箟 浼氬彂鐜板綋緙栬瘧鍣ㄧ紪璇戣繃涓嬈headerfile h浠ュ悗 *** artnose_ _ _ _headerfile_h 榪欎釜瀹忓氨琚瀹氫箟浜 浠ュ悗瀵筯eaderfile h鐨勭紪璇戦兘浼氳煩榪噄nt iglobal 榪欎竴琛 褰撶劧 *** artnose_ _ _ _headerfile_h 榪欎釜瀹忔槸鍙浠ヤ換鎰忓畾涔夌殑 浣嗘槸榪欎釜瀹忔湰韜涓嶈兘鍜屽叾瀹冩枃浠朵腑瀹氫箟鐨勫畯閲嶅 鎵浠MFC鍦ㄨ嚜鍔ㄧ敓鎴愮殑鏂囦歡涓鎬繪槸浣跨敤涓涓闅忔満浜х敓鐨勯暱搴﹂潪甯擱暱鐨勫畯 浣嗘垜瑙夊緱榪欐病鏈夊繀瑕 鎴戝緩璁鍦ㄨ繖涓瀹忎腑鍔犲叆涓浜涙湁鎰忎箟鐨勪俊鎮 姣旀柟浣滆 鏂囦歡鍚 鏂囦歡鍒涘緩鏃墮棿絳夌瓑 鍥犱負鎴戜滑鏈夋椂鍊欎細蹇樿板湪娉ㄩ噴涓鍔犲叆榪欎簺淇℃伅
銆銆鍦╒C Net 涓鎴戜滑涓嶄細鍐嶇湅瑙佽繖浜涘畯瀹氫箟浜 鍥犱負鍦ㄨ繖閲屼細鏅閬嶄嬌鐢ㄤ竴涓棰勫勭悊鎸囦護
銆銆#pragma once
銆銆鍙瑕佸湪澶存枃浠剁殑鏈寮濮嬪姞鍏ヨ繖鏉℃寚浠ゅ氨鑳藉熶繚璇佸ご鏂囦歡琚緙栬瘧涓嬈 榪欐潯鎸囦護瀹為檯涓婂湪VC 涓灝卞凡緇忔湁浜 浣嗘槸鑰冭檻鍒板吋瀹規у苟娌℃湁澶澶氱殑浣跨敤瀹
銆銆 婧愪唬鐮佺増鏈鎺у埗
銆銆褰撴垜浠涓鴻稿氬鉤鍙板紑鍙戝氫釜鐗堟湰鐨勬椂鍊欓勭紪璇戞寚浠ゅ拰瀹忓畾涔変篃鑳藉熷府鎴戜滑鐨勫繖 鍋囪炬垜浠鐜板湪涓篧INDOWS 鍜孡INUX寮鍙戜簡涓濂楄蔣浠 鐢變簬榪欎袱縐嶇郴緇熺殑涓嶅悓 鎴戜滑涓嶅緱涓嶅湪紼嬪簭鎺у埗婧愪唬鐮佺殑鐗堟湰 姣旀柟鍐呭瓨鐨勫垎閰 鎴戜滑鍙浠ュ湪LINUX涓婁嬌鐢ㄦ爣鍑咰鐨刴alloc 鍑芥暟 浣嗘槸鎴戜滑甯屾湜鍦 WINDOWS涓婁嬌鐢℉eapAlloc API 涓嬮潰鐨勪唬鐮佹紨紺轟簡榪欑嶆儏鍐
銆銆main錛堬級
銆銆{
銆銆鈥︹︹︹︹︹︹︹
銆銆#ifdef _WINDOWS_PLATFORM
銆銆HeapAlloc錛 錛
銆銆#else
銆銆malloc錛 錛
銆銆#endif
銆銆鈥︹︹︹︹︹︹︹
銆銆}
銆銆褰撴垜浠鍦╓INDOWS 騫沖彴涓婄紪璇戞ょ▼搴忕殑鏃跺 鍙闇瑕佸畾涔塤WINDOWS_PLATFORM榪欎釜瀹 閭d箞HeapAlloc榪欐潯璇鍙ュ氨鑳藉熻搗浣滅敤浜 榪欐牱灝辮兘澶熻╂垜浠鍦ㄥ悓涓涓鏂囦歡涓涓轟笉鍚岀殑騫沖彴瀹炵幇涓嶅悓鐗堟湰鐨勪唬鐮 鍚屾椂淇濇寔紼嬪簭鐨勮壇濂界粨鏋 鍦ㄨ稿氭儏鍐典笅 鎴戜滑榪樺彲浠ヤ負涓涓鏂規硶浣跨敤涓嶅悓鐨勭畻娉 鐒跺悗鐢ㄥ畯瀹氫箟鏉ラ拡瀵逛笉鍚岀殑鎯呭喌閫夋嫨鍏朵腑鐨勪竴涓榪涜岀紪璇 榪欏湪MFC搴旂敤紼嬪簭涓鏄浣跨敤寰楁渶澶氱殑 鏈鏄庢樉鐨勫氨鏄鏂囦歡涓緇忓父瀛樺湪鐨
銆銆#ifdef _DEBUG
銆銆鈥︹︹︹︹︹︹︹ some code鈥︹︹︹︹
銆銆#endif
銆銆榪欐牱鐨勪唬鐮 榪欎簺浠g爜鍦ㄥ簲鐢ㄧ▼搴忕殑璋冭瘯鐗堬紙DEBUG錛変腑浼氬彂鎸ュ叾浣滅敤
銆銆#Pragma 鎸囦護
銆銆鍦ㄦ墍鏈夌殑棰勫勭悊鎸囦護涓 #Pragma 鎸囦護鍙鑳芥槸鏈澶嶆潅鐨勪簡 瀹冪殑浣滅敤鏄璁懼畾緙栬瘧鍣ㄧ殑鐘舵佹垨鑰呮槸鎸囩ず緙栬瘧鍣ㄥ畬鎴愪竴浜涚壒瀹氱殑鍔ㄤ綔 鍏舵牸寮忎竴鑸涓
銆銆#Pragma Para
銆銆鍏朵腑Para 涓哄弬鏁 涓嬮潰鏉ョ湅涓浜涘父鐢ㄧ殑鍙傛暟
銆銆message 鍙傛暟 Message 鍙傛暟鏄鎴戞渶鍠滄㈢殑涓涓鍙傛暟 瀹冭兘澶熷湪緙栬瘧淇℃伅杈撳嚭紿楀彛涓杈撳嚭鐩稿簲鐨勪俊鎮 榪欏逛簬婧愪唬鐮佷俊鎮鐨勬帶鍒舵槸闈炲父閲嶈佺殑 鍏朵嬌鐢ㄦ柟娉曚負
銆銆#Pragma message錛 娑堟伅鏂囨湰 錛
銆銆褰撶紪璇戝櫒閬囧埌榪欐潯鎸囦護鏃跺氨鍦ㄧ紪璇戣緭鍑虹獥鍙d腑灝嗘秷鎮鏂囨湰鎵撳嵃鍑烘潵
銆銆褰撴垜浠鍦ㄧ▼搴忎腑瀹氫箟浜嗚稿氬畯鏉ユ帶鍒舵簮浠g爜鐗堟湰鐨勬椂鍊 鎴戜滑鑷宸辨湁鍙鑳介兘浼氬繕璁版湁娌℃湁姝g『鐨勮劇疆榪欎簺瀹 姝ゆ椂鎴戜滑鍙浠ョ敤榪欐潯鎸囦護鍦ㄧ紪璇戠殑鏃跺欏氨榪涜屾鏌 鍋囪炬垜浠甯屾湜鍒ゆ柇鑷宸辨湁娌℃湁鍦ㄦ簮浠g爜鐨勪粈涔堝湴鏂瑰畾涔変簡_X 榪欎釜瀹忓彲浠ョ敤涓嬮潰鐨勬柟娉
銆銆#ifdef _X
銆銆#Pragma message錛 _X macro activated錛 錛
銆銆#endif
銆銆褰撴垜浠瀹氫箟浜哶X 榪欎釜瀹忎互鍚 搴旂敤紼嬪簭鍦ㄧ紪璇戞椂灝變細鍦ㄧ紪璇戣緭鍑虹獥鍙i噷鏄劇ず _X macro activated錛 鎴戜滑灝變笉浼氬洜涓轟笉璁板緱鑷宸卞畾涔夌殑涓浜涚壒瀹氱殑瀹忚屾姄鑰蟲尃鑵浜
銆銆鍙︿竴涓浣跨敤寰楁瘮杈冨氱殑pragma鍙傛暟鏄痗ode_seg 鏍煎紡濡
銆銆#pragma code_seg錛 [ section name [ section class ] ] 錛
銆銆瀹冭兘澶熻劇疆紼嬪簭涓鍑芥暟浠g爜瀛樻斁鐨勪唬鐮佹 褰撴垜浠寮鍙戦┍鍔ㄧ▼搴忕殑鏃跺欏氨浼氫嬌鐢ㄥ埌瀹
銆銆鏈鍚庝竴涓姣旇緝甯哥敤鐨勫氨鏄涓婇潰鎵璇寸殑#pragma once 鎸囦護浜
銆銆 VC棰勫畾涔夌殑瀹
銆銆鍦╒C涓鏈変竴綾誨畯騫朵笉鏄鐢辯敤鎴風敤#define璇鍙ュ畾涔夌殑 鑰屾槸緙栬瘧鍣ㄦ湰韜灝辮兘澶熻瘑鍒瀹冧滑 榪欎簺瀹忕殑浣滅敤涔熸槸鐩稿綋澶х殑 璁╂垜浠鏉ョ湅絎涓涓 涔熸槸MFC涓浣跨敤寰楁渶棰戠箒鐨勪竴涓 __FILE__
銆銆褰撶紪璇戝櫒閬囧埌榪欎釜瀹忔椂灝辨妸瀹冨睍寮鎴愬綋鍓嶈緙栬瘧鏂囦歡鐨勬枃浠跺悕 濂戒簡 鎴戜滑椹涓婂氨鍙浠ユ兂鍒板彲浠ョ敤瀹冩潵鍋氫粈涔 褰撳簲鐢ㄧ▼搴忓彂鐢熼敊璇鏃 鎴戜滑鍙浠ユ姤鍛婅繖涓閿欒鍙戠敓鐨勭▼搴忎唬鐮佸湪鍝涓鏂囦歡閲 姣旀柟鍦ㄦ枃浠秚est cpp涓鏈夎繖鏍風殑浠g爜
銆銆try
銆銆{
銆銆char * p=new錛坈har[ ]錛
銆銆}
銆銆catch錛圕Exception *e 錛
銆銆{
銆銆TRACE錛 there is an error in file %s __FILE__錛
銆銆}
銆銆鍦ㄧ▼搴忚繍琛岀殑鏃跺 濡傛灉鍐呭瓨鍒嗛厤鍑虹幇浜嗛敊璇 閭d箞鍦ㄨ皟璇曠獥鍙d腑浼氬嚭鐜皌here is an error in file test cpp 榪欏彞璇 褰撶劧 鎴戜滑榪樺彲浠ユ妸榪欎釜閿欒淇℃伅鏄劇ず鍦ㄥ埆鐨勫湴鏂
銆銆濡傛灉鎴戜滑榪樿兘澶熻板綍閿欒鍙戠敓鍦ㄥ摢涓琛屽氨濂戒簡 騫歌繍鐨勬槸 涓巁_FILE__瀹忓畾涔変竴鏍 榪樻湁涓涓瀹忚板綍浜嗗綋鍓嶄唬鐮佹墍鍦ㄧ殑琛屾暟 榪欎釜瀹忔槸__LINE__ 浣跨敤涓婇潰鐨勪袱涓瀹 鎴戜滑鍙浠ュ啓鍑轟竴涓綾諱技浜嶸C鎻愪緵鐨凙SSERT璇鍙 涓嬮潰鏄鏂規硶
銆銆#define MyAssert錛坸錛
銆銆if錛堬紒錛坸錛夛級
銆銆MessageBox錛坃_FILE__ __LINE__ NULL MB_OK錛
銆銆鎴戜滑鍦ㄥ簲鐢ㄧ▼搴忎腑鍙浠ヨ薄浣跨敤ASSERT璇鍙ヤ竴鏍蜂嬌鐢ㄥ畠 鍦ㄩ敊璇鍙戠敓鏃 瀹冧細寮瑰嚭涓涓瀵硅瘽妗 鍏舵爣棰樺拰鍐呭瑰憡璇変簡鎴戜滑閿欒鍙戠敓鐨勬枃浠跺拰浠g爜琛屽彿 鏂逛究鎴戜滑鐨勮皟璇 榪欏逛簬涓嶈兘浣跨敤ASSERT璇鍙ョ殑欏圭洰鏉ヨ存槸闈炲父鏈夌敤鐨
銆銆闄や簡榪欎袱涓瀹忎互澶 榪樻湁璁板綍緙栬瘧鏃墮棿鐨刜_TIME__ 璁板綍鏃ユ湡鐨刜_DATE__ 浠ュ強璁板綍鏂囦歡淇鏀規椂闂寸殑__TIMESTAMP__瀹
銆銆浣跨敤榪欎簺棰勫畾涔夌殑瀹 鎴戜滑鍑犱箮鍙浠ョ敓鎴愬拰VC鑳藉熺敓鎴愮殑涓鏍峰畬鏁寸殑婧愪唬鐮佷俊鎮鎶ヨ〃
銆銆 緇撹
lishixin/Article/program/net/201311/13360
㈥ C語言文件的編譯與執行的四個階段並分別描述
開發C程序有四個步驟:編輯、編譯、連接和運行。
任何一個體系結構處理器上都可以使用C語言程序,只要該體系結構處理器有相應的C語言編譯器和庫,那麼C源代碼就可以編譯並連接到目標二進制文件上運行。
1、預處理:導入源程序並保存(C文件)。
2、編譯:將源程序轉換為目標文件(Obj文件)。
3、鏈接:將目標文件生成為可執行文件(EXE文件)。
4、運行:執行,獲取運行結果的EXE文件。
(6)C語言預編譯的例子擴展閱讀:
將C語言代碼分為程序的幾個階段:
1、首先,源代碼文件測試。以及相關的頭文件,比如stdio。H、由預處理器CPP預處理為.I文件。預編譯的。文件不包含任何宏定義,因為所有宏都已展開,並且包含的文件已插入。我歸檔。
2、編譯過程是對預處理文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程往往是整個程序的核心部分,也是最復雜的部分之一。
3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成可以運行的可執行程序。也就是說,您需要鏈接大量的文件才能獲得「a.out」,即最終的可執行文件。
4、在鏈接過程中,需要重新調整其他目標文件中定義的函數調用指令,而其他目標文件中定義的變數也存在同樣的問題。