⑴ C++中如何定義變數
簡單說:你要定義一個整形變數就是直接「類型 變數名;」就行。例如定一個叫做a的整形變數
「int a;」
詳細說明:
在C++中,變數聲明(declaration)只有在使用extern關鍵字時才成立,其他情況下都是定義(definition),而在使用extern的同時給變數賦初始值,則聲明變為定義,extern關鍵字也將被編譯器忽略。C++變數的作用域預設情況下是全局的,也就是對多個源文件可見,比如說,如果在a.cpp和b.cpp中都有
int a;
則編譯器鏈接兩個文件時會報告錯誤,「變數重復定義」。因此,要使變數定義只對該源文件可見,就要顯式加上static關鍵字。因此,我們可以想到,如果在a.cpp中有
extern int a;
而在b.cpp中有
static int a = 9;
那麼,編譯器鏈接時會給出錯誤信息,「找不到a的定義」,因為a的定義在b.cpp並只對該文件可見,a.cpp找不到a的定義因此出錯。
變數的聲明和定義是比較容易混淆的概念,因此記住一點,除非有extern關鍵字,否則都是變數的定義。由此,我們可以歸納出幾點好的程序設計風格:
1. 不要把變數定義放入.h文件,這樣容易導致重復定義錯誤。
2. 盡量使用static關鍵字把變數定義限制於該源文件作用域內,除非該變數被設計成全局的。
例外情況是const變數和typedef類型,在《The C++ Programming Language》9.2節中說到,const和typedef預設作用域是局部的,因此不需要static來顯式聲明。因此,在.h文件中放置const變數定義不會產生問題,編譯器會給每個引用該.h文件的源文件產生一份該const變數的局部定義,就像該變數是定義於該源文件中一樣。大家也不用太擔心編譯器這么做會浪費空間,因為編譯器優化過程一般會把有相同值的const變數進行合並。
對於static關鍵字,要多說幾句的是,static一般有兩種意思,當修飾函數定義里的變數或者類成員變數時,稱作靜態變數;修飾其他變數時,稱作局部變數。為防止混淆,一般不要特意給局部變數加上static關鍵字。除了static關鍵字,namespace也可以使變數定義成為局部的。
⑵ 編譯器在編譯的時候做了什麼給申明的變數分配內存
第一是將java文件編譯成位元組碼文件 就是class文件 給jvm執行
第二就是分配常量池 就是給你代碼裡面的變數和方法分配空間
⑶ 在Mac電腦里怎麼將編譯器添加到PATH環境變數中
mac 一般使用bash作為默認shell
Mac系統的環境變數,載入順序為:
/etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc
當然/etc/profile和/etc/paths是系統級別的,系統啟動就會載入,後面幾個是當前用戶級的環境變數。後面3個按照從前往後的順序讀取,如果~/.bash_profile文件存在,則後面的幾個文件就會被忽略不讀了,如果~/.bash_profile文件不存在,才會以此類推讀取後面的文件。~/.bashrc沒有上述規則,它是bash shell打開的時候載入的。
⑷ Inno Setup 編譯器」如何打包 javaWeb 應用程序,自動設置環境變數
三、打包步驟
1、打開Inno Setup編譯器,新建腳本向導,填寫程序的基本信息,如圖:
2、點擊下一步,選擇文件類型與名稱;
3、點擊下一步,勾取「」應用程序沒有主執行文件,並添加文件夾,如上面提到的D:webexe,並把子文件夾中的文件包含在內
4、點擊下一步,選取程序圖標設置;
5、點擊下一步,指定安裝前後顯示的文件信息和許可文件;
6、點擊下一步,選擇安裝語言;
7、點擊下一步,選擇編譯器輸出的路徑和exe安裝包的名稱等,如圖:
8、點擊下一步,編譯腳本即完成。
打開
⑸ c++中為什麼有些變數在編譯是就由編譯器分配了內存空間,還沒有運行怎麼會佔用內存呢
還沒有運行怎麼會佔用內存呢?!(這一點還要懷疑嗎!?)
所謂在編譯期間分配空間指的是靜態分配空間(相對於用new動態申請空間),如全局變數或靜態變數(包括一些復雜類型的常量),它們所需要的空間大小可以明確計算出來,並且不會再改變,因此它們可以直接存放在可執行文件的特定的節里(而且包含初始化的值),程序運行時也是直接將這個節載入到特定的段中,不必在程序運行期間用額外的代碼來產生這些變數。
其實在運行期間再看「變數」這個概念就不再具備編譯期間那麼多的屬性了(諸如名稱,類型,作用域,生存期等等),對應的只是一塊內存(只有首址和大小),所以在運行期間動態申請的空間,是需要額外的代碼維護,以確保不同變數不會混用內存。比如寫new表示有一塊內存已經被佔用了,其它變數就不能再用它了; 寫delete表示這塊內存自由了,可以被其它變數使用了。(通常我們都是通過變數來使用內存的,就編碼而言變數是給內存塊起了個名字,用以區分彼此)
內存申請和釋放時機很重要,過早會丟失數據,過遲會耗費內存。特定情況下編譯器可以幫我們完成這項復雜的工作(增加額外的代碼維護內存空間,實現申請和釋放)。從這個意義上講,局部自動變數也是由編譯器負責分配空間的。進一步講,內存管理用到了我們常常掛在嘴邊的堆和棧這兩種數據結構。
最後對於「編譯器分配空間」這種不嚴謹的說法,你可以理解成編譯期間它為你規劃好了這些變數的內存使用方案,這個方案寫到可執行文件裡面了(該文件中包含若干並非出自你大腦衍生的代碼),直到程序運行時才真正拿出來執行!
⑹ 編譯器對c語言中變數名怎麼編譯
對於變數名,會根據變數類型
開辟不同大小的內存空間
然後指定一個相對地址記錄下來。
對於編譯後, 不存在變數名,只有對應的相對地址。
⑺ 我們經常看到書上面說的 某某變數的內存單元是編譯器在編譯時候分配的 是什麼意思
所謂在編譯期間分配空間指的是靜態分配空間(相對於用new動態申請空間),如全局變數或靜態變數(包括一些復雜類型的常量),它們所需要的空間大小可以
明確計算出來,並且不會再改變,因此它們可以直接存放在可執行文件的特定的節里(而且包含初始化的值),程序運行時也是直接將這個節載入到特定的段中,不
必在程序運行期間用額外的代碼來產生這些變數。
其實在運行期間再看「變數」這個概念就不再具備編譯期間那麼多的屬性了(諸如名稱,類型,作用
域,生存期等等),對應的只是一塊內存(只有首址和大小),
所以在運行期間動態申請的空間,是需要額外的代碼維護,以確保不同變數不會混用內存。比如寫new表示有一塊內存已經被佔用了,其它變數就不能再用它了;
寫delete表示這塊內存自由了,可以被其它變數使用了。(通常我們都是通過變數來使用內存的,就編碼而言變數是給內存塊起了個名字,用以區分彼此)
內存申請和釋放時機很重要,過早會丟失數據,過遲會耗費內存。特定情況下編譯器可以幫我們完成這項復雜的工作(增加額外的代碼維護內存空間,實
現申請和釋 放)。從這個意義上講,局部自動變數也是由編譯器負責分配空間的。進一步講,內存管理用到了我們常常掛在嘴邊的堆和棧這兩種數據結構。
最後對於「編譯器分配空間」這種不嚴謹的說法,你可以理解成編譯期間它為你規劃好了這些變數的內存使用方案,這個方案寫到可執行文件裡面了(該文件中包含若干並非出自你大腦衍生的代碼),直到程序運行時才真正拿出來執行。
⑻ 編譯器編譯高級語言為低級語言的時候,給全局變數或靜態變數是如何分配內存的
對於C和C++的編譯器,全局變數和靜態變數都是在專門的數據區保存的,更具體一點,一般是在.data和.bss段保存的,具體在哪個段,編譯器會根據代碼中是否對這些變數進行了初始化來決定,如果初始化過,並且初始化的值不為0,那麼這個這個變數一般就會被放在編譯結果的.data段中,否則就是放在.bss段中。
.data段中就保存變數的符號,還保存變數的初始化值,而在.bss段中,只保存變數的符號,而不保存值,這是因為這部分的變數都將被初始化為0,這也是為什麼static聲明的變數即使沒有初始化也會是0的原因。
這些段都會在程序被執行的時候由操作系統(或鏈接器)載入到指定的內存中,便完成相應的初始化。
⑼ 編譯器對作為局部變數的數組是怎麼管理的放在堆棧中
C語言的堆跟棧是有區別的,請大家不要混淆。
局部變數和函數調用時的實參是放在棧里。所以有大家常說函數調用時的入棧,出桟這個說話。
動態申請的內存放在堆里的。
全局變數和靜態變數是放在另外的全局內存區。