国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

深圳網(wǎng)站建設 推薦xtdseo百度系app有哪些

深圳網(wǎng)站建設 推薦xtdseo,百度系app有哪些,wordpress傷感主頁,網(wǎng)站的二維碼怎么變小前言: 由于c語言的程序編譯鏈接的這塊知識點不清楚,回來復習一遍,以便于好理解c知識,我會盡快更新下一篇文章。 目錄 1.程序的翻譯環(huán)境和執(zhí)行環(huán)境 2.翻譯環(huán)境(編譯鏈接) 編譯(編譯器&#xf…

前言:

? ? ? ? 由于c語言的程序編譯鏈接的這塊知識點不清楚,回來復習一遍,以便于好理解c++知識,我會盡快更新下一篇文章。

目錄

1.程序的翻譯環(huán)境和執(zhí)行環(huán)境

2.翻譯環(huán)境(編譯+鏈接)

編譯(編譯器)

預編譯(預處理)

1.頭文件的包含

2.注釋的測試

編譯過程

匯編過程

鏈接

1.合并段表

2.符號表的合并和重定位

計算機語言的發(fā)展

運行環(huán)境(翻譯之后)

3.預處理詳解?

3.1 預定義符號

3.2 #define

3.2.1 #define 定義標識符

3.2.2 #define 定義宏 ?

3.2.3#define 替換規(guī)則

3.2.4 #和##

3.2.5 帶副作用的宏參數(shù)


1.程序的翻譯環(huán)境和執(zhí)行環(huán)境

總體過程:

ANSI C的任何一種實現(xiàn)中,存在兩個不同的環(huán)境

第1種是翻譯環(huán)境,在這個環(huán)境中源代碼被轉(zhuǎn)換為可執(zhí)行的機器指令。

第2種是執(zhí)行環(huán)境,它用于實際執(zhí)行代碼。

2.翻譯環(huán)境(編譯+鏈接

我們常說一個test.c文件要經(jīng)過以下步驟才能產(chǎn)生可執(zhí)行的程序,那么具體是怎么做到的呢?

在vs編譯器上是要經(jīng)過以下過程的:

源文件和目標文件的關(guān)系:

????????VS是一個集成開發(fā)環(huán)境,集成很多的功能ctr1+F5,不方便觀察每個細節(jié)的功能接下來,我使用gcc這個編譯器給大家演示

????????由于上圖的操作把這個編譯運行的步驟一次走完了,我們一步步來,咱們用指令讓程序停在預編譯的階段:

編譯(編譯器)

預編譯(預處理)

將控制臺的內(nèi)容放到test.i之后,預處理階段所做的事情:

1.頭文件的包含

2.注釋的測試

編譯過程

功能:把C語言代碼翻譯成匯編代碼
經(jīng)歷四個過程:涉及一門課 -- 《編譯原理》
1.語法分析
2.詞法分析
3.語義分析
4.符號匯總
函數(shù)名,全局變量不會匯總 局部變量(函數(shù)運行起來才行)
推薦書籍:《程序員的自我修養(yǎng)》
鏈接:https://pan.baidu.com/s/1cVcZRTj772hJXm0mO0Q_cw?pwd=1234?
提取碼:1234
編譯階段所做的事情,gcc操作過程:

匯編過程

1.把匯編代碼轉(zhuǎn)換成二進制的指令

2.形成符號表?

鏈接

1.合并段表

2符號表的合并和重定位

1、2的作用其實是在鏈接期間為這種跨文件的代碼進行協(xié)作的時候起作用的。

在vscode中操作:

過程:

1.合并段表

2.符號表的合并和重定位

? ? ? ? 把無效的地址給替換掉,符號表和段表的關(guān)系是:符號表是段表的內(nèi)容

那該如何體現(xiàn)這個作用呢?

????????假設我們在test.c文件底下extern了一個函數(shù)Add,但是在add.c底下沒有實現(xiàn)這個Add函數(shù),就會輸出以下錯誤(鏈接型錯誤)

? ? ? ? 如果說這個函數(shù)寫錯的話,在main函數(shù)內(nèi)調(diào)用大寫的,但是在add.c內(nèi)定義成小寫的,是依然找不到

計算機語言的發(fā)展

運行環(huán)境(翻譯之后)

🔍程序執(zhí)行的過程:
1. 程序必須載入 內(nèi)存 中。在有操作系統(tǒng)的環(huán)境中:一般這個由操作系統(tǒng)完成。在獨立的環(huán)境中,程序的載入必須由手工安排,也可能是通過可執(zhí)行代碼置入只讀內(nèi)存來完成。
2. 程序的執(zhí)行便開始。接著便調(diào)用 main 函數(shù)(main函數(shù)第一行開始)
3. 開始執(zhí)行程序代碼。這個時候程序?qū)⑹褂靡粋€運行時堆棧( stack )-- 函數(shù)棧幀 ,存儲函數(shù)的局部變量和返回地址。 程序同時也可以使用靜態(tài)(static)內(nèi)存,存儲于靜態(tài)內(nèi)存中的變量在程序的整個執(zhí)行過程一直保留他們的值。
4. 終止程序。正常終止 main 函數(shù);也有可能是意外終止。

3.預處理詳解?

3.1 預定義符號

這些預定義符號都是語言內(nèi)置的。
__FILE__ ? ? ? //進行編譯的源文件
__LINE__ ? ? //文件當前的行號
__DATE__ ? ? //文件被編譯的日期
__TIME__ ? ? //文件被編譯的時間

執(zhí)行:

這個預定義符號也是語言內(nèi)置的

__STDC__ ? ?//如果編譯器遵循ANSI C,其值為1,否則未定義

?而放在gcc編譯器上面是可以執(zhí)行通過的:

????????編譯器在代碼編譯的時候,會對函數(shù)和變量名重命名的,C++ 中會更加復雜

????????在C語言中重命名的規(guī)則基本就是:加_

3.2 #define

3.2.1 #define 定義標識符

語法:
#define name stuff

全部例子:?

#define MAX 1000
#define reg register ? ? ? ? ?//為 register這個關(guān)鍵字,創(chuàng)建一個簡短的名字
#define do_forever for(;;) ? ? //用更形象的符號來替換一種實現(xiàn)
#define CASE break;case ? ? ? ?//在寫case語句的時候自動把 break寫上。
// 如果定義的 stuff過長,可以分成幾行寫,除了最后一行外,每行的后面都加一個反斜杠(續(xù)行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \date:%s\ttime:%s\n" ,\__FILE__,__LINE__ , ? ? ? \__DATE__,__TIME__ )
分點敘述:
#define MAX 1000

?#define reg register//為 register這個關(guān)鍵字,創(chuàng)建一個簡短的名字 ?

#define do_forever for(;;)//用更形象的符號來替換一種實現(xiàn)?

#define CASE break;case //在寫case語句的時候自動把 break寫上。

長行如何拆分,\后面只能是換行,不能是其他?

?如果定義的 stuff過長,可以分成幾行寫,除了最后一行外,每行的后面都加一個反斜杠(續(xù)行符)。

提問:
在define定義標識符的時候,要不要在最后加上 ; ?
比如:
#define MAX 1000;
#define MAX 1000
建議不要加上 ; , 這樣容易導致問題。
比如下面的場景:
if ( condition )
????????max = MAX ;
else
????????max = 0 ;

這里會出現(xiàn)語法錯誤.

3.2.2 #define 定義宏 ?

下面是宏的聲明方式:
#define name( parament-list ) stuff
其中的 parament - list 是一個由逗號隔開的符號表,它們可能出現(xiàn)在 stuff
注意:
參數(shù)列表的左括號必須與 name緊鄰 。
如果兩者之間有任何空白存在,參數(shù)列表就會被解釋為 stuff 的一部分
如:
#define SQUARE( x ) x * x
這個宏接收一個參數(shù) x .
如果在上述聲明之后,你把
SQUARE ( 5 );
置于程序中,預處理器就會用下面這個表達式替換上面的表達式:
5 * 5
圖解:
警告:
這個宏存在一個問題:
觀察下面的代碼段:
int a = 5 ;
printf ( "%d\n" , SQUARE ( a + 1 ) );
乍一看,你可能覺得這段代碼將打印 36 這個值。
事實上,它將打印 11.
為什么?圖解:
替換文本時,參數(shù)x被替換成a + 1,所以這條語句實際上變成了:
printf ("%d\n",a + 1 * a + 1 );
這樣就比較清晰了,由替換產(chǎn)生的表達式并沒有按照預想的次序進行求值。
在宏定義上加上兩個括號,這個問題便輕松的解決了:
#define SQUARE(x) (x) * (x)
這樣預處理之后就產(chǎn)生了預期的效果:
printf ( "%d\n" ,( a + 1 ) * ( a + 1 ) );
但是這樣也會受到外部因素的影響:
#define DOUBLE(x) (x) + (x)

定義中我們使用了括號,想避免之前的問題,但是這個宏可能會出現(xiàn)新的錯誤。

int a = 5 ;
printf ( "%d\n" , 10 * DOUBLE ( a ));
這將打印什么值呢?
warning
看上去,好像打印 100 ,但事實上打印的是 55.
我們發(fā)現(xiàn)替換之后:
printf ("%d\n",10 * (5) + (5));
乘法運算先于宏定義的加法,所以出現(xiàn)了55 .
這個問題,的解決辦法是在宏定義表達式兩邊加上一對括號就可以了。
#define DOUBLE( x) ? ( ( x ) + ( x ) )
提示:
所以用于對數(shù)值表達式進行求值的宏定義都應該用這種方式加上括號,避免在使用宏時由于參數(shù)中的操作符或鄰近操作符之間不可預料的相互作用。

所以這就涉及到#define的替換規(guī)則了

3.2.3#define 替換規(guī)則

在程序中擴展 #define 定義符號和宏時,需要涉及幾個步驟。
????????1. 在調(diào)用宏時,首先對參數(shù)進行檢查,看看是否包含任何由 #define 定義的符號。如果是,它們首先被替換。
????????2. 替換文本隨后被插入到程序中原來文本的位置。對于宏,參數(shù)名被他們的值所替換。
????????3. 最后,再次對結(jié)果文件進行掃描,看看它是否包含任何由 #define 定義的符號。如果是,就重復上述處理過程。
注意:
1. 宏參數(shù)和 #define 定義中可以出現(xiàn)其他 #define 定義的符號。但是對于宏,不能出現(xiàn)遞歸。
2. 當預處理器搜索 #define 定義的符號的時候,字符串常量的內(nèi)容并不被搜索。

3.2.4 ###

如何把參數(shù)(變量名)插入到字符串中?

首先我們看看這樣的代碼:

char* p = "hello ""bit\n";
printf("hello"" bit\n");
printf("%s", p);

?這里輸出的是不是hello bit

答案是確定的:是
圖解:

我們發(fā)現(xiàn)字符串是有自動連接的特點的。

? ? ? ? 請看下圖,有沒有那么一條語句,將這三個變量傳參傳過去,然后實現(xiàn)它們各自的輸出呢??

現(xiàn)在定義一個宏

#define print_format(num, format) \?printf("the value of #num is "format)

并且讓它輸出:

這時候發(fā)現(xiàn)需要正確輸入它們的數(shù)值:

這里只有當字符串作為宏參數(shù)的時候才可以把字符串放在字符串中。
1. 另外一個技巧是:
使用 # 把一個宏參數(shù)變成對應的字符串 。
比如:

代碼中的 #value? 會預處理器處理為: "value"
## 的作用
## 可以把位于它兩邊的符號合成一個符號。
它允許宏定義從分離的文本片段創(chuàng)建標識符。
注:這樣的連接必須產(chǎn)生一個合法的標識符。否則其結(jié)果就是未定義的。(也就是說這個拼接之后的變量名前提是要初始化一個值)

3.2.5 帶副作用的宏參數(shù)

當宏參數(shù)在宏的定義中出現(xiàn)超過一次的時候,如果參數(shù)帶有副作用,那么你在使用這個宏的時候就可能出現(xiàn)危險,導致不可預測的后果。副作用就是表達式求值的時候出現(xiàn)的永久性效果。
例如
x + 1 ; //不帶副作用
x ++ ; //帶有副作用
MAX 宏可以證明具有副作用的參數(shù)所引起的問題

在vscode2019內(nèi)調(diào)試一下:

? ? ? ? 想知道宏和函數(shù)的區(qū)別嗎,欲知后事如何,請聽下回分解。

http://aloenet.com.cn/news/34258.html

相關(guān)文章:

  • 做網(wǎng)站算軟件開發(fā)么長尾關(guān)鍵詞在線查詢
  • 建設網(wǎng)站開通網(wǎng)線多少錢資源網(wǎng)站優(yōu)化排名優(yōu)化
  • 北京網(wǎng)站推廣|網(wǎng)站制作|網(wǎng)絡推廣|網(wǎng)站建設7個湖北seo網(wǎng)站推廣策略
  • 沈陽微信網(wǎng)站搜索引擎優(yōu)化的要點
  • 三亞網(wǎng)站建設哪家好760關(guān)鍵詞排名查詢
  • 做網(wǎng)站用win還是li注冊百度賬號
  • 湖南建設人力資源官方網(wǎng)站萬能軟文模板
  • 廣西做網(wǎng)站口碑營銷方案
  • wordpress去掉導航欄武漢seo關(guān)鍵字推廣
  • 中山專業(yè)制作網(wǎng)站武漢網(wǎng)絡推廣自然排名
  • 彭陽門戶網(wǎng)站建設網(wǎng)絡推廣的方式和途徑有哪些
  • 做網(wǎng)站搞個物理服務器引流推廣犯法嗎
  • 網(wǎng)站沒有問題但是一直做不上首頁seo托管
  • 網(wǎng)站程序設計百度鏈接收錄提交入口
  • 學做效果圖的網(wǎng)站有哪些新手電商運營從哪開始學
  • 網(wǎng)站底部樣式智能建站平臺
  • 網(wǎng)站開發(fā)技術(shù)項目代碼搜索南寧seo外包要求
  • 做網(wǎng)站業(yè)務員怎么樣為企業(yè)策劃一次網(wǎng)絡營銷活動
  • 怎么做新網(wǎng)站的推廣下載優(yōu)化大師并安裝
  • 正規(guī)網(wǎng)站建設官網(wǎng)上海做網(wǎng)絡口碑優(yōu)化的公司
  • 電商網(wǎng)絡運營浙江搜索引擎優(yōu)化
  • 鄭州企業(yè)網(wǎng)站優(yōu)化哪家便宜2022適合小學生的簡短新聞
  • 山西網(wǎng)站制作公司百度小說官網(wǎng)
  • 照片做視頻ppt模板下載網(wǎng)站好seo關(guān)鍵詞排名優(yōu)化價格
  • 做電影網(wǎng)站涉及的侵權(quán)問題網(wǎng)盤搜索神器
  • 做釣魚網(wǎng)站要什么工具中企動力做網(wǎng)站推廣靠譜嗎
  • wap網(wǎng)站微信一鍵登錄網(wǎng)絡營銷案例有哪些
  • 公司網(wǎng)站背景圖百度快速收錄教程
  • 網(wǎng)站建設明細報價單凡科網(wǎng)免費建站
  • 深圳做網(wǎng)站排名價格百度網(wǎng)盤怎么找片