最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解讀C++編譯報錯有跡可尋

 更新時間:2023年05月08日 17:09:36   作者:111盡力而為  
這篇文章主要介紹了解讀C++編譯報錯有跡可尋,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

1. 什么是編譯

1.1. 計算機程序設(shè)計語言的三個層次

在計算機系統(tǒng)中,主要有三種層次的語言,他們是機器語言、匯編語言、高級語言。

機器語言是可以被計算機理解的語言,計算機只能理解01二進制序列,但是機器語言特別難記。

匯編語言在機器語言的基礎(chǔ)上引入了助記符,方便記憶一些,但是要熟悉目標機器的指令特點,使用效率低,對人要求高。

正是如此引用高級語言,高級語言采用類似數(shù)學(xué)定義或者自然語言的簡潔形式,接近人的習慣并不依賴特定機器。

圖1 -1計算機程序設(shè)計語言的三個層次

1.2. 三種語言的關(guān)系

高級語言和匯編語言都要翻譯成機器語言才能在計算機上執(zhí)行,其中將高級語言轉(zhuǎn)換成匯編語言或者機器語言的過程叫做編譯,將匯編語言轉(zhuǎn)換成機器語言叫做匯編。

編譯的本質(zhì)是將高級語言轉(zhuǎn)換成匯編語言或者機器語言的過程,其中高級語言就是源語言、匯編語言或機器語言就是目標語言。

2. 計算機語言處理系統(tǒng)

編譯器是計算機語言處理系統(tǒng)的核心部件,但在計算機語言處理系統(tǒng)中,除了編譯器,還有預(yù)處理器、匯編器、鏈接器。

圖2-1 計算機語言處理系統(tǒng)

預(yù)處理器的作用是把存儲在不同文件中的源程序聚合在一起;把稱為宏的縮寫語句轉(zhuǎn)換成原始語句。

編譯器的作用是把高級語言翻譯成匯編語言。

匯編器的作用是把匯編語言程序轉(zhuǎn)換成可重定向的機器代碼??芍囟ㄏ虻囊馑际菂R編器所生成的這段代碼在內(nèi)存中存放的開始位置不是固定的,代碼中所有地址都是相對起始地址的相對地址。起始地址+相對地址=絕對地址(內(nèi)存中地址)。

鏈接器的作用是將多個可重定向的機器代碼文件(包括庫文件)鏈接在一起,也解決外部地址問題。所謂的外部地址問題是一個文件代碼引用了另外一個文件中的數(shù)據(jù)對象或者過程,那這個數(shù)據(jù)對象或者過程地址就是外部文件地址。

3. 編譯系統(tǒng)的結(jié)構(gòu)

編譯系統(tǒng)的本質(zhì)正是將高級語言翻譯成匯編語言或者機器語言,那么如何翻譯?

3.1. 人工翻譯英文到漢文的例子

In the room,he broke a window with a hammer.

這個英文翻譯成漢語,主要分成兩個步驟,見圖3-1。這里的源語言就是英語,目標語言就是漢語。

圖3-1 英漢翻譯的一般方法 

分析過程如下:

1)找到最關(guān)鍵的謂語break。

2)然后進行主語謂語賓語的分析

圖3-2 英語句子成分劃分 

3)用中間形式表示語義

圖3-3 語義表示

4)根據(jù)圖的意思用漢語翻譯

在房間里,他用錘子砸了一扇窗戶。

3.2. 語義分析過程的一點啟發(fā)

通過以上的分析,完成翻譯就是理解句子的語義,也就是語義分析。

要進行語義分析,需要知道短語的結(jié)構(gòu),需要先進行語法分析,通過語法分析劃分句子成分。句子成分是由單詞構(gòu)成的,因此需要通過詞法分析獲取詞類。

一張圖解釋詞法分析,語法分析,語義分析的關(guān)系,見圖3-4。

圖3-4 詞法分析語法分析語義分析的關(guān)系 

3.3. 編譯器的結(jié)構(gòu)

正如前面討論的那樣子,編譯器翻譯的核心就是找到語義。實際的編譯器的結(jié)構(gòu)如下3-5。

圍繞語義分析,形成前端分析部分,與源語言有關(guān)。圍繞目標語言生成構(gòu)成后端綜合部分,與目標語言有關(guān)。

而語義的中間表示形式,與目標語言無關(guān),從而與目標機器無關(guān)。

其中詞法分析器、語法分析器、語義分析器、中間代碼生成器構(gòu)成編譯的核心。

圖3-5 編譯器的結(jié)構(gòu) 

4. 自動化編譯系統(tǒng)

在計算機語言處理系統(tǒng)中,解決了源文件和庫文件到最終的可執(zhí)行文件的過程。這個過程可以看做是一個輸入輸出系統(tǒng)。

輸入的是源文件(*.h,*.cpp)或者庫文件(*.h,*.so),輸出的是可執(zhí)行文件(*.elf)或者庫(*.so)。

對于這一過程進行輸入輸出管理的過程需要搭建自動化編譯系統(tǒng),它由make、makefile以及計算機語言處理系統(tǒng)構(gòu)成。

 圖4-1 自動化編譯系統(tǒng)

  • Makefile作用

它保存了編譯器和鏈接器的參數(shù)選項,還表達了所有源文件之間的依賴關(guān)系。makefile關(guān)系到了整個工程的編譯規(guī)則。

一個工程中的源文件不計數(shù),其按類型、功能、模塊分別放在若干個目錄中,makefile定義了一系列的規(guī)則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至于進行更復(fù)雜的功能操作,因為makefile就像一個Shell腳本一樣,其中也可以執(zhí)行操作系統(tǒng)的命令。

  • Make作用

Make是一種程序,它首先讀取makefile文件,然后調(diào)用編譯器、匯編器、鏈接器以便產(chǎn)生最終的可執(zhí)行文件和庫。

5. 編譯報錯

5.1. 編譯報錯的本質(zhì)

經(jīng)過上述對自動化編譯系統(tǒng)的概述,以及對計算機語言處理系統(tǒng)的概述。我們可以推測編譯報錯的本質(zhì)就是自動化編譯系統(tǒng)報錯,自動化編譯系統(tǒng)作為一個輸入輸出系統(tǒng),非法的輸入或者空的輸入自然會引起編譯報錯。

makefile管理整個工程的源文件和庫文件,以及計算機語言處理系統(tǒng)中的預(yù)處理器、編譯器、匯編器、鏈接器。從上述的編譯原理討論不難總結(jié)出幾個典型的編譯報錯類型:

  • 輸入的makefile文件中存在makefile語法錯誤,將會導(dǎo)致make報錯。計算機語言處理系統(tǒng)參數(shù)設(shè)置不正確,或環(huán)境路徑錯誤將會導(dǎo)致make報錯。
  • 輸入的源文件中存在C++語言的預(yù)處理語法錯誤,將會導(dǎo)致預(yù)處理器編譯報錯。
  • 輸入的源文件中存在C++語言中的詞法、語法、語義錯誤,將導(dǎo)致編譯器報錯。
  • 輸入的源文件中存在C++語言中庫使用錯誤,將導(dǎo)致編譯器報錯。
  • 輸入的庫文件和源文件存在C++語言中的語法錯誤,導(dǎo)致鏈接器報錯。或者輸入的庫文件和源文件存在環(huán)境路徑錯誤,將導(dǎo)致鏈接器報錯。

5.2. makefile報錯

  • Makefile語法錯誤
  • 編譯器參數(shù)設(shè)置錯誤

5.3. 預(yù)處理報錯

  • C++宏定義錯誤

5.4. 源程序編譯報錯

  • C++詞法錯誤
  • C++語法錯誤
  • C++語義錯誤
  • C++的類庫使用錯誤

5.5. 庫鏈接報錯

  • C++語法錯誤
  • 庫頭文件與庫本身不匹配錯誤

5.6. 其他錯誤

  • 路徑配置錯誤
  • 文件權(quán)限獲取錯誤
  • 源文件未及時保存錯誤

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++實現(xiàn)LeetCode(22.生成括號)

    C++實現(xiàn)LeetCode(22.生成括號)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(22.生成括號),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 使用C語言解決字符串全排列問題

    使用C語言解決字符串全排列問題

    這篇文章主要介紹了使用C語言解決字符串全排列問題,文中包括了一道ACM相關(guān)的競賽題目作為實例,需要的朋友可以參考下
    2015-08-08
  • C++設(shè)計模式之中介者模式

    C++設(shè)計模式之中介者模式

    這篇文章主要介紹了C++設(shè)計模式之中介者模式,本文講解了什么是中介者模式、中介者模式的使用場合、中介者模式的優(yōu)缺點等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • C語言中的運算符和結(jié)合性問題

    C語言中的運算符和結(jié)合性問題

    這篇文章主要介紹了C語言中的運算符和結(jié)合性問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 一文詳解C++子類函數(shù)為什么不能重載父類函數(shù)

    一文詳解C++子類函數(shù)為什么不能重載父類函數(shù)

    這篇文章主要介紹了一文詳解C++子類函數(shù)為什么不能重載父類函數(shù),文章圍繞主題展開詳細的內(nèi)容戒殺,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)庫分頁

    Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)庫分頁

    數(shù)據(jù)庫分頁展示,在所有的涉及到數(shù)據(jù)庫記錄的項目中都是需要的。本文將利用Qt實現(xiàn)通用數(shù)據(jù)庫的分頁展示,感興趣的小伙伴可以跟隨小編學(xué)習一下
    2022-02-02
  • C++類和對象補充

    C++類和對象補充

    類是創(chuàng)建對象的模板,一個類可以創(chuàng)建多個對象,每個對象都是類類型的一個變量;創(chuàng)建對象的過程也叫類的實例化。每個對象都是類的一個具體實例(Instance),擁有類的成員變量和成員函數(shù)
    2021-10-10
  • Qt 進度條的實現(xiàn)示例

    Qt 進度條的實現(xiàn)示例

    進度條在很多時候都可以用到,有時我們需要在表格,樹狀欄中直觀顯示任務(wù)進度或消耗百分比,本文就詳細的介紹一下Qt 進度條的使用實例,感興趣的可以了解一下
    2021-06-06
  • C語言中堆空間的生成與釋放詳解

    C語言中堆空間的生成與釋放詳解

    以下是對C語言中堆空間的生成與釋放進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • C語言動態(tài)數(shù)組詳解

    C語言動態(tài)數(shù)組詳解

    本文給大家分享的是一則使用C語言實現(xiàn)動態(tài)數(shù)組的代碼,完美解決內(nèi)存溢出以及內(nèi)存回收問題,有需要的小伙伴可以參考下
    2021-09-09

最新評論

林甸县| 湖南省| 河池市| 连南| 漳浦县| 大城县| 长阳| 靖远县| 大城县| 炎陵县| 东明县| 宝坻区| 涟源市| 澳门| 化州市| 包头市| 宜宾市| 辽阳市| 五大连池市| 滦平县| 山东省| 上栗县| 化隆| 镇赉县| 郎溪县| 永寿县| 绥中县| 哈尔滨市| 景洪市| 永登县| 金山区| 岳阳市| 武功县| 漯河市| 亳州市| 沂源县| 济阳县| 晋城| 安陆市| 靖宇县| 新邵县|