從宣告到鏈結性的一點討論

2021-10-06 16:17:45 字數 830 閱讀 2807

參考文件

這是為了支援分離式編譯而設計的,分離式編譯允許把程式拆成多個邏輯部分來編寫,當程式被分為多個檔案,則需要有在檔案間共享**的方式, 這就是宣告和定義的區別由來,宣告使得名字為程式所知,乙個檔案如果想要使用別處的名字則必須包含對那個名字的宣告,而定義負責制建立於名字關聯的實體。

並且關於作用域開始的點也有相應的規則描述,這兩部分可以參見:scope - cppreference: baic concepts

但是,作用域更多體現的是變數與其他**間的互動上,它反映的僅僅是語法層面名稱的存在性問題,例如:乙個定義在區域性**塊中的變數,在**塊以外就不可用了,但是為什麼不可用呢? 這裡引出了乙個更深層次的問題,名稱的存在性反映的是與該名稱對應的實體的存在,即儲存期的概念。

與作用域不太一樣,儲存期是從變數自身的角度來看待可知性問題。體現的是程式執行時的存在性問題,在c++中,程式中的所有物件都具有下列儲存期之一:

那麼由於各個編譯單元(cpp檔案)內或多或少的包含一些公共的共享變數,這些共享變數在每個編譯單元內都有,但是語義上都指代同乙個東西,這就要求編譯器能夠正確識別哪些是共享的變數,哪些不是共享的變數, 因此,所謂的鏈結性描述的是鏈結時可共享的程度,c++中鏈結性分為三種:

這三種鏈結性的規則描述可以參見:storage duration - cppreference: basic concepts

從上面我們知道了作用域是通過語法規則來描述的,那麼儲存期和鏈結性又是怎麼限定的呢?這裡就必須提到儲存型別修飾符了,即storage class specifiers。它包含了鏈結性和儲存期兩方面的含義

在c++中,儲存型別修飾是宣告語法的乙個可選部分,c++目前可用的儲存型別修飾符是以下5種:

wince romfs的一點討論

wince 的 rom file system 是用romimage生成的。將nk.bin中所有的執行檔案 exe,dll 組織到 平坦空間 重定義dll和exe執行位址使之沒有重疊 按照執行時的格式存放等 這樣就省去了載入定位的過程 檔案的其他資訊 如把檔名,起始位址,長度等 組織在特定的段以便查...

從後台到webshell的一點思路

安全天使 1.asp acc mssql程式 主要是利用後台對access資料庫的 備份資料庫 或 恢復資料庫 功能,備份的資料庫路徑 等變數沒有過濾導致可以把任意檔案字尾改為asp,從而得到webshell,msssql版的程式就直接應用了access版的 導致sql版照樣可以利用。具體方法和分析...

有關生活的一點討論

今天和同事在一起討論生活難易的問題,看到乙個帖子,國外的乙個快50歲的軟體工程師寫的,說他失業也,再就業的難題,然後我們就發散開來了。今年28歲了,不知不覺,還感覺自己很年輕,但是其實已經不小了啊,之前一直都在逃避,逃避在上海買房的問題,逃避未來的發展,因為現在在一家外企做研發,自我感覺還很好,也許...