成交型網(wǎng)站建設app營銷策略
1.程序的翻譯環(huán)境和執(zhí)行環(huán)境
第一種是翻譯環(huán)境,在這個環(huán)境中源代碼被轉(zhuǎn)換為可執(zhí)行的機器指令
第二種是執(zhí)行環(huán)境,它用于實際執(zhí)行代碼
2.翻譯環(huán)境
分為四個階段
預編譯階段 ,編譯,匯編,鏈接
程序編譯過程:多個源文件經(jīng)過編譯器形成目標文件,在經(jīng)過鏈接器形成可執(zhí)行程序
//鏈接的符號表的合并和符號表的重定位,匯編形成的符號表經(jīng)過鏈接會對符號表進行重定位,會把無意義的符號刪除(這里的符號一般是函數(shù)名和全局變量)
3.運行環(huán)境
- 程序必須載入內(nèi)存中。在有操作系統(tǒng)的環(huán)境中:一般這個由操作系統(tǒng)完成。在獨立的環(huán)境中,程序
的載入必須由手工安排,也可能是通過可執(zhí)行代碼置入只讀內(nèi)存來完成。- 程序的執(zhí)行便開始。接著便調(diào)用main函數(shù)。
- 開始執(zhí)行程序代碼。這個時候程序?qū)⑹褂靡粋€運行時堆棧(stack),存儲函數(shù)的局部變量和返回地址。程序同時也可以使用靜態(tài)(static)內(nèi)存,存儲于靜態(tài)內(nèi)存中的變量在程序的整個執(zhí)行過程一直保留他們的值。
4.終止程序。正常終止main函數(shù);也有可能是意外終止。
4.預處理詳解
FILE //進行編譯的源文件
LINE //文件當前的行號
DATE //文件被編譯的日期
TIME //文件被編譯的時間
STDC //如果編譯器遵循ANSIC,其值為1,否則未定義
5.預處理詳解
#define定義標識符
//在預處理階段替換, 預處理 選項 gcc -E test.c -o test.i,可看詳細步驟
//不要在最后加上‘;’
#define MAX 1000
#define reg registe
#define do_forever for(;😉// 替換成死循環(huán)
#define CASE break;case//
#define 定義宏
//所以用于對數(shù)值表達式進行求值的宏定義都應該用這種方式加上括號,避免在使用宏時由于參數(shù)中的操作符或鄰近操作符之間不可預料的相互作用。
#define name( parament-list ) stuff,//#define name( parament-list ) stuff
其中的 parament-list 是一個由逗號隔開的符號表
注意:參數(shù)列表的左括號必須與name緊鄰。
如果兩者之間有任何空白存在,參數(shù)列表就會被解釋為stuff的一部分
#define SQUARE(x) (x) * (x)
#和##
//將宏參數(shù)之前加上#也有連接功能
//字符串有連接功能
##的作用 ##可以把位于它兩邊的符號合成一個符號
帶副作用的宏參數(shù)
宏與函數(shù)的對比
宏的優(yōu)點 :函數(shù)在調(diào)用時和返回時時間更多一些(這里可以看匯編代碼);更為重要的是函數(shù)的參數(shù)必須聲明為特定的類型。而宏是與類型無關(guān)的
宏的缺點:在使用宏時需將宏定義的代碼插入程序中除非宏比較短,否則可能大幅度增加程序的長度;還有宏是沒法調(diào)試的;宏由于類型無關(guān),也就不夠嚴謹;宏可能會帶來運算符優(yōu)先級的問題,導致程容易出現(xiàn)錯。
7.#undef
#undefzuo作用是取消宏定義//第二個箭頭指向的宏參數(shù)不可使用
8.條件編譯
在編譯一個程序的時候我們?nèi)绻獙⒁粭l語句(一組語句)編譯或者放棄是很方便的。
//這是常見條件編譯指令
//這是嵌套編譯指令
列如;如果滿足條件則可實現(xiàn)
9.文件包含
一個是庫函數(shù)的頭文件 一個是自己設置的頭文件\庫文件一般用
‘< >’ 頭文件一般用“ ”包含
對于庫文件可以使用"< >"也可以使用“ ”的形式包含
//常見問題
- 頭文件中的 ifndef/define/endif是干什么用的?//通過條件編譯,就可以避免頭文件的重復引入 或#pragma once
- #include <filename.h> 和 #include "filename.h"有什么區(qū)別?//‘< >’先在源文件所在目錄下查找,如果該頭文件未找到,編譯器就像查找?guī)旌瘮?shù)頭文件一樣在標準位置查找頭文件。