<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 牛人業(yè)話 > DSP編程技巧之7---揭開(kāi)編譯器神秘面紗之預(yù)處理與診斷

          DSP編程技巧之7---揭開(kāi)編譯器神秘面紗之預(yù)處理與診斷

          作者:paradoxfx 時(shí)間:2014-03-10 來(lái)源:電子產(chǎn)品世界 收藏

              在軟件例如時(shí),代碼分析工具可以方便我們對(duì)代碼進(jìn)行分析,例如我們把鼠標(biāo)指向一個(gè)函數(shù)名的時(shí)候,所指的地方就能出來(lái)一個(gè)實(shí)時(shí)菜單,使得我們可以直接定位到函數(shù)的聲明、被調(diào)用的位置或者某個(gè)宏定義等等,非常方便。這種功能是如何實(shí)現(xiàn)的呢?在編譯器的前端是一個(gè)語(yǔ)義,它負(fù)責(zé)把源程序中的token找出來(lái),然后parser(也有的地方叫分析器)就可以解析這些token,并產(chǎn)生樹(shù)狀表,供環(huán)境使用;此外還可以完成一部分的語(yǔ)法錯(cuò)誤檢查功能。如果希望了解關(guān)于解析器的更詳細(xì)的信息,可以參考編譯原理方面最著名的“龍書(shū)”,即《Compliers: Principles, Techniques, &Tools》;在K&RC語(yǔ)言文檔的A12這一節(jié)中也對(duì)解析器的預(yù)處理功能進(jìn)行了詳細(xì)的敘述,它預(yù)處理的信息主要包括:

          本文引用地址:http://www.ex-cimer.com/article/234414.htm

            1. 宏定義和擴(kuò)展,例如_INLINE;

            2. #include引用的文件,包括<>和“”兩種方法引用的頭文件;

            3. 條件編譯指令,例如#if,#endif等等;

            4. 其它的多種預(yù)處理指令,主要是#開(kāi)頭的一些指令,例如#error。

            我們可以控制編譯器的預(yù)處理選項(xiàng),使得解析器根據(jù)我們的需求產(chǎn)生需要的預(yù)處理結(jié)果,方便我們對(duì)程序的開(kāi)發(fā)調(diào)試;這些選項(xiàng)如表1所示。

            表1 編譯器中解析器的預(yù)處理選項(xiàng)

          預(yù)處理選項(xiàng)

          別名

          控制效果

          --preproc_dependency[=filename

          -ppd

          只執(zhí)行預(yù)處理操作,并不輸出預(yù)處理的解析結(jié)果,但是會(huì)并產(chǎn)生供make程序使用的列表文件,其中包含了被預(yù)處理的程序中存在的與頭文件中的定義關(guān)聯(lián)的行信息。

          make程序是編譯器在編譯時(shí)調(diào)用的編譯程序。如果使用命令行的方法,可以不使用而直接調(diào)用make程序進(jìn)行編譯。

          --preproc_includes[=filename]

          -ppi

          只執(zhí)行預(yù)處理操作,但是會(huì)把包含#include指令的文件列表寫(xiě)入列表文件。

          --preproc_macros[=filename]

          -ppm

          只執(zhí)行預(yù)處理操作,會(huì)生成其中包含了預(yù)定義的和用戶自定義的宏的多個(gè)文件,這些文件和被預(yù)處理的文件的名字一樣,只是其擴(kuò)展名為.pp。

          預(yù)定義的宏是TI預(yù)定義的,它在預(yù)處理結(jié)果中被用/* Predefined */標(biāo)注出。

          --preproc_only

          -ppo

          只執(zhí)行預(yù)處理操作,并把解析的結(jié)果輸出為名字與輸入文件名一致、擴(kuò)展名為.pp的文件。

          在這種模式下,#include文件中的信息會(huì)被復(fù)制到.pp文件中,宏定義和其它的一些預(yù)處理指令信息都會(huì)被完全展開(kāi)。

          --preproc_with_comment

          -ppc

          只執(zhí)行預(yù)處理操作,并把解析的結(jié)果輸出為名字與輸入文件名一致、擴(kuò)展名為.pp的文件;與-ppo相比,輸出的文件中保留了輸入程序中的注釋信息。

          --preproc_with_compile

          -ppa

          在執(zhí)行預(yù)處理之后,繼續(xù)編譯工作。對(duì)比可以看出,在預(yù)處理選項(xiàng)中,除了-ppa之外,其余的幾個(gè)選項(xiàng)只完成預(yù)處理功能,并不進(jìn)行接下來(lái)的編譯工作。-ppa選項(xiàng)可以和其它的預(yù)處理選項(xiàng)一起使用,這樣既可以輸出預(yù)處理結(jié)果,又可以在預(yù)處理完成之后繼續(xù)編譯工作。

          --preproc_with_line

          -ppl

          只執(zhí)行預(yù)處理操作,并把包含行控制信息(#line指令)的解析結(jié)果輸出為名字與輸入文件名一致、擴(kuò)展名為.pp的文件。

            因?yàn)轭A(yù)處理器要使用到文件中的符號(hào)信息,所以相關(guān)的預(yù)定義信息一定要提供給預(yù)處理器,否則找不到符號(hào)信息就要報(bào)錯(cuò)了。符號(hào)選項(xiàng)比較簡(jiǎn)單,就是預(yù)定義與解除定義,如表2所示。

            表2 預(yù)定義的符號(hào)選項(xiàng)

          語(yǔ)言選項(xiàng)

          別名

          控制效果

          --define=name[=def]

          -D

          預(yù)定義符號(hào),使用方法是--define=name=""string def""。在編譯器選項(xiàng)里使用-D,與在C程序里使用#define的效果是一樣的。

          --undefine=name

          -U

          解除對(duì)某個(gè)符號(hào)的定義,它會(huì)覆蓋-D選項(xiàng)的效果。

            在程序的處理過(guò)程中,我們可以控制編譯器輸出診斷信息選項(xiàng),使得它輸出我們期望的詳細(xì)信息,更加容易定位和解決一些看起來(lái)難以捉摸的問(wèn)題;這些選項(xiàng)如表3所示。需要注意的是,診斷信息相關(guān)的選項(xiàng)必須放在鏈接器選項(xiàng)--run_linker之前。

            表3編譯器的診斷信息選項(xiàng)

          語(yǔ)言選項(xiàng)

          別名

          控制效果

          --compiler_revision

           

          在信息窗口中打印出編譯器的版本號(hào)。這個(gè)用處不太大,因?yàn)閺?/span>help關(guān)于里面很容易看到。

          --diag_error=num

          -pdse

          這里的num是診斷信息的標(biāo)識(shí)符。不顯示標(biāo)識(shí)符的話,在編譯出現(xiàn)錯(cuò)誤時(shí),會(huì)提示:

          error: a break statement may only be used within a loop or switch

          啟用的話,在有錯(cuò)誤的時(shí)候,會(huì)提示:

          error #77: this declaration has no storage class or type specifier xxxxx;

          -pdse是把標(biāo)識(shí)符num對(duì)應(yīng)的語(yǔ)句標(biāo)記為錯(cuò)誤。

          --diag_remark=num

          -pdsr

          把標(biāo)識(shí)符num對(duì)應(yīng)的語(yǔ)句標(biāo)記為提示。

          --diag_suppress=num

          -pds

          把標(biāo)識(shí)符num對(duì)應(yīng)的語(yǔ)句標(biāo)記為不提示。

          --diag_warning=num

          -pdsw

          把標(biāo)識(shí)符num對(duì)應(yīng)的語(yǔ)句標(biāo)記為警告。

          --diag_wrap={on|off}

           

          默認(rèn)為on,打包診斷信息。

          --display_error_number

          -pden

          把診斷信息標(biāo)識(shí)符和它對(duì)應(yīng)的文本說(shuō)明一起顯示出來(lái)。

          --emit_warnings_as_errors

          -pdew

          把警告信息作為錯(cuò)誤處理。在這樣的嚴(yán)格的模式下,必須消除所有的警告和錯(cuò)誤,編譯才能繼續(xù)。

          --issue_remarks

          -pdr

          提示所有的提醒信息(即非嚴(yán)重的警告信息)。

          --no_warnings

          -pdw

          不顯示警告信息,但是錯(cuò)誤信息還是會(huì)提示的:畢竟有錯(cuò)誤在的話編譯無(wú)法完成。

          --quiet

          -q

          安靜模式,不顯示編譯過(guò)程中的診斷信息。

          --set_error_limit=num

          -pdel

          這個(gè)選項(xiàng)設(shè)置編譯過(guò)程中錯(cuò)誤的上限,比如有10個(gè)源程序,設(shè)定錯(cuò)誤上限為5,假如第3個(gè)文件時(shí)就已經(jīng)有5個(gè)錯(cuò)誤了,那么編譯器就停止了編譯,不再繼續(xù)編譯剩下的文件了。

          --super_quiet

          -qq

          超級(jí)安靜模式。與-q相比,多了個(gè)q,足以看出它的級(jí)別。顯然它的處理速度最快,但是給出的診斷信息那是一個(gè)也沒(méi)有:最多告訴你程序有x個(gè)錯(cuò)誤。如果確信程序完全無(wú)誤,用這個(gè)選項(xiàng)編譯倒是要快了不少。

          --tool_version

          -version

          顯示編譯過(guò)程中調(diào)用的各個(gè)工具的版本信息。

          --verbose

           

          啰嗦模式:顯示函數(shù)編譯過(guò)程中的處理信息。

          --verbose_diagnostics

          -pdv

          在啰嗦模式的基礎(chǔ)上,把源程序中的對(duì)應(yīng)部分也顯示出來(lái)。

          --write_diagnostics_file

          -pdf

          產(chǎn)生診斷信息文件。

          c語(yǔ)言相關(guān)文章:c語(yǔ)言教程




          關(guān)鍵詞: DSP 編程 CCS 解析器 K&RC

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();