<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

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

本文引用地址:http://dyxdggzs.com/article/234414.htm

  1. 宏定義和擴展,例如_INLINE;

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

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

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

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

  表1 編譯器中解析器的預處理選項

預處理選項

別名

控制效果

--preproc_dependency[=filename

-ppd

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

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

--preproc_includes[=filename]

-ppi

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

--preproc_macros[=filename]

-ppm

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

預定義的宏是TI預定義的,它在預處理結果中被用/* Predefined */標注出。

--preproc_only

-ppo

只執行預處理操作,并把解析的結果輸出為名字與輸入文件名一致、擴展名為.pp的文件。

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

--preproc_with_comment

-ppc

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

--preproc_with_compile

-ppa

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

--preproc_with_line

-ppl

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

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

  表2 預定義的符號選項

語(yǔ)言選項

別名

控制效果

--define=name[=def]

-D

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

--undefine=name

-U

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

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

  表3編譯器的診斷信息選項

語(yǔ)言選項

別名

控制效果

--compiler_revision

 

在信息窗口中打印出編譯器的版本號。這個(gè)用處不太大,因為從help關(guān)于里面很容易看到。

--diag_error=num

-pdse

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

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

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

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

-pdse是把標識符num對應的語(yǔ)句標記為錯誤。

--diag_remark=num

-pdsr

把標識符num對應的語(yǔ)句標記為提示。

--diag_suppress=num

-pds

把標識符num對應的語(yǔ)句標記為不提示。

--diag_warning=num

-pdsw

把標識符num對應的語(yǔ)句標記為警告。

--diag_wrap={on|off}

 

默認為on,打包診斷信息。

--display_error_number

-pden

把診斷信息標識符和它對應的文本說(shuō)明一起顯示出來(lái)。

--emit_warnings_as_errors

-pdew

把警告信息作為錯誤處理。在這樣的嚴格的模式下,必須消除所有的警告和錯誤,編譯才能繼續。

--issue_remarks

-pdr

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

--no_warnings

-pdw

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

--quiet

-q

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

--set_error_limit=num

-pdel

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

--super_quiet

-qq

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

--tool_version

-version

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

--verbose

 

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

--verbose_diagnostics

-pdv

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

--write_diagnostics_file

-pdf

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

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




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

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>