C程式中的 line意義何在

2021-07-25 16:02:22 字數 1354 閱讀 8108

在學習一些專案源**時,看到了大量的#line定義,小人不才,語法搜搜是大概懂了,可問個為什麼,卻難道了自己。

#line是c語言預處理器,語法格式為:

#line number 「filename」

如 #line 123 「file.c」

意思就是改變__line__和__file__巨集內容。

當在程式中使用這兩個巨集的時候,就會因為#line的定義而改變,例子很簡單,我就不列舉了,不明白的朋友可以自己試試,加入#line後,列印這兩個巨集的內容。

這兩個巨集是永久被改變的,會影響當前的c檔案一直到檔案末尾。

回到原來的專案源**中,源**部分片段:

#line 357 "..\gram\sprt.y"

case

72: #line 366 "..\gram\sprt.y"

case

73: #line 367 "..\gram\sprt.y"

源程式中,有大量這種**,和#line,在沒查資料前,我一直以為#line是鏈結到外部檔案的一種用法,後來才發現,這種做法僅僅是為了滿足除錯需要,並且,發布產品時,完全可以全部刪除。

首先,#line是改變__line__和__file__巨集的,這兩個巨集通常用來除錯定位問題。

在平常專案開發中,可能用到的不多,甚至是根本不需要,因為我嘗試了很多種方法,如巨集,函式,動態庫等方式,來**#line的意義所在,都沒能找到原因,後來知曉了分析器後,才得知。

首先介紹兩個程式,乙個是flex,乙個是bison。

flex是詞法分析器,它可以根據使用者的輸入,依據一定的規則(flex語法)將輸入拆分成各個有效片段。

bison是語法分析器,它可以根據使用者的輸入,依據一定的規則(bison語法)將輸入的一組文字分析成語法樹,並解釋執行。

業界人士,通常用flex和bison共同來開發語法直譯器,例如nessus的攻擊指令碼,unity3d的action指令碼等。

大致了解了flex和bison後,進行了一些實踐,#line在這裡面就顯得有為重要了,它可以幫助你處理編譯鏈結時的錯誤定位,因為你可能寫了乙個語法哪怕是%%,都會生成上千行的**。

什麼時候使用#line,我思考後總結了一下:

其一,當你給使用者提供一些指令碼支援,語法解釋等工具集時,需要這種#line來幫助使用者定位問題。

其二,當你給使用者提供一系列api或sdk時,當使用者在使用api時,可能需要#line來幫助使用者定位問題。

其三,#line不僅僅能改變__line__,__file__巨集,它可以在使用者對**進行編譯鏈結時,顯示到錯誤列表中。

雖然在實際的開發中,基本不用到,但是相對了解下,說不定哪一天需要用flex和bison開發屬於自己的指令碼語言。

春節的意義何在

再過兩個星期,就到了中國的農曆春節。前兩天打 到家裡,說我只能買到除夕夜的機票,而趕到家裡則需要到大年初一的早上。那邊安靜了一下,然後說我們今年把年夜飯推遲幾個小時,等我回來。老實說,我不知道父母在一年的時間裡是如何的思念,但是我知道這個長假是我們在外漂泊的兒女盡孝道的時間,應該好好陪伴一下父母。而...

如何在C 中呼叫C程式

c 和c是兩種完全不同的編譯鏈結處理方式,如果直接在c 裡面呼叫c函式,會找不到函式體,報鏈結錯誤。要解決這個問題,就要在 c 檔案裡面顯示宣告一下哪些函式是c寫的,要用c的方式來處理。1.引用標頭檔案前需要加上 extern c 如果引用多個,那麼就如下所示 extern c 然後在呼叫這些函式之...

如何在C 中呼叫C程式?

c 和c是兩種完全不同的編譯鏈結處理方式,如果直接在c 裡面呼叫c函式,會找不到函式體,報鏈結錯誤。要解決這個問題,就要在 c 檔案裡面顯示宣告一下哪些函式是c寫的,要用c的方式來處理。1.引用標頭檔案前需要加上 extern c 如果引用多個,那麼就如下所示 extern c 然後在呼叫這些函式之...