導航:首頁 > 源碼編譯 > 在編譯過程中聲明屬於哪個過程

在編譯過程中聲明屬於哪個過程

發布時間:2022-07-23 09:45:28

㈠ 請問C語言中所謂的函數聲明是指什麼為什麼要進行聲明什麼叫做函數聲明

舉個例子來說明吧
void foo();

int main()
{
foo();
}

void foo()
{
;
}

以上代碼中,第一句就是所謂函數聲明。
其實直接用函數定義也就是void foo(){;}替代第一句也是可以的,不過函數的聲明讓你可以在定義它的代碼段之前使用它。

比如以上的例子中,在編譯進行到main函數中的foo調用的時候,foo函數還是沒有定義的,但我們通過foo的聲明告訴了編譯器:foo是一個函數的名字,這個函數有著怎樣怎樣的參數表等等。

㈡ 類的聲明和類的實現

問題好羅嗦 首先看出來你對類和對象分的就不太清楚,類是虛擬的 比如人類 而對象卻是現實存在的 是類的一個實例 人就是人類一個實例 人具有人類的一切屬性和行為 對象也一樣 對象擁有類的一切屬性和方法. 編譯器只是把代碼編譯解釋成計算機可以識別的二進制代碼,所以在內存中建立分配一個對象決不是編譯器所為.是執行那一行代碼時乾的事. 它會為類迅速分配一個空間稱為這個類的實例 就是對象 而對象名就是它的首地址 所以通過對象名可以訪問它成員 就是用到計算機所謂的偏移量方法. 當創建一個對象時會自動的調用它的構造方法 注意並不是構造方法構造對象的喲 它只是對對象做一些初始化 類自建請查類信息表

㈢ C語言文件的編譯與執行的四個階段並分別描述

開發C程序有四個步驟:編輯、編譯、連接和運行。

任何一個體系結構處理器上都可以使用C語言程序,只要該體系結構處理器有相應的C語言編譯器和庫,那麼C源代碼就可以編譯並連接到目標二進制文件上運行。

1、預處理:導入源程序並保存(C文件)。

2、編譯:將源程序轉換為目標文件(Obj文件)。

3、鏈接:將目標文件生成為可執行文件(EXE文件)。

4、運行:執行,獲取運行結果的EXE文件。

(3)在編譯過程中聲明屬於哪個過程擴展閱讀:

將C語言代碼分為程序的幾個階段:

1、首先,源代碼文件測試。以及相關的頭文件,比如stdio。H、由預處理器CPP預處理為.I文件。預編譯的。文件不包含任何宏定義,因為所有宏都已展開,並且包含的文件已插入。我歸檔。

2、編譯過程是對預處理文件進行詞法分析、語法分析、語義分析和優化,生成相應的匯編代碼文件。這個過程往往是整個程序的核心部分,也是最復雜的部分之一。

3、匯編程序不直接輸出可執行文件,而是輸出目標文件。匯編程序可以調用LD來生成可以運行的可執行程序。也就是說,您需要鏈接大量的文件才能獲得「a.out」,即最終的可執行文件。

4、在鏈接過程中,需要重新調整其他目標文件中定義的函數調用指令,而其他目標文件中定義的變數也存在同樣的問題。

㈣ c語言中,聲明和定義有什麼區別

如果是指變數的聲明和定義:

從編譯原理上來說,聲明是僅僅告訴編譯器,有個某類型的變數會被使用,但是編譯器並不會為它分配任何內存。而定義就是分配了內存。
對於下面的兩句代碼:
void Func()
{
int a;
int b=1;
a=0;
}
對於第一行代碼,編譯器不會做任何事,它不會為它在棧中分配一點東西,直到第三句,a=0;時,編譯器才會將其壓入棧中。而對於int b=0;這一句,編譯器就會生成一條指令,為它賦值。如果反匯編,看到的代碼可能是這樣的:
push 1;
push 0;
當然,並不一定編譯器就會樣做,也有可能在聲明int a時,編譯器就會把一個廢值入棧,到第三條再為其賦值,這要看編譯器的具體取捨,所以,聲明不一定不是定義,而定義一定是定義。
但是,下面的聲明,一定僅僅是聲明:
extern int a;
這表時,有一個int變數a,它一定是在另外其他地方定義的,所以編譯器此時一定不會做什麼分配內存的事,因為它就是聲明,僅僅表明下面的代碼引用了一個符號,而這個符號是int類型的a而已。

如果是指函數的聲明和定義:

聲明:一般在頭文件里,對編譯器說:這里我有一個函數叫function() 讓編譯器知道這個函數的存在。

定義:一般在源文件里,具體就是函數的實現過程 寫明函數體。

㈤ 在C語言中聲明和定義有什麼區別

C語言變數的定義和聲明的不同之處:

1、變數在使用前就要被定義或者聲明;

2、在一個程序中,變數只能定義一次,卻可以聲明多次;

3、定義分配存儲空間,而聲明不會

(5)在編譯過程中聲明屬於哪個過程擴展閱讀:

變數的定義:用於為變數分配存儲空間,還可以為變數指定初始值。在程序中,變數有且僅有一個定義。

聲明:用於向程序表明變數的類型和名字。

定義也是聲明:當定義變數的時候我們聲明了它的類型和名字。可以通過使用extern聲明變數名而不定義它。不定義變數的聲明包括對象名、對象類型和對象類型前的關鍵字extern。

extern聲明不是定義,也不分配存儲空間。事實上它只是說明變數定義在程序的其他地方。程序中變數可以聲明多次,但只能定義一次。

只有當聲明也是定義時,聲明才可以有初始化式,因為只有定義才分配存儲空間。初始化式必須要有存儲空間來進行初始化。如果聲明有初始化式,那麼它可被當作是定義,即使聲明標記為extern。

任何在多文件中使用的變數都需要有與定義分離的聲明。在這種情況下,一個文件含有變數的定義,使用該變數的其他文件則包含該變數的聲明(而不是定義)。

㈥ 編譯器在編譯的時候做了什麼給申明的變數分配內存

第一是將java文件編譯成位元組碼文件 就是class文件 給jvm執行
第二就是分配常量池 就是給你代碼裡面的變數和方法分配空間

㈦ 問一個vc++編程的問題,編譯程序如何處理類的聲明語句和類的對象定義句

編譯只是生成目標文件,只有當這個可執行程序運行起來,才有所謂的空間分配。而目標文件本身只是相當於一個指導者,告訴操作系統要怎麼來執行我的命令。比如說:我在程序里定義了一個全局的變數a,並且將它初始化了;又定義了一個全局變數b,但是沒有初始化它;還有局部變數c;那麼程序是怎麼運行的呢?首先我們的目標文件是被放在叫做text segment(程序段)的內存段中,它是只讀不可被修改的,程序的運行就是靠cpu從這個程序段中一條一條的讀取命令來執行的。它看見了a,於是在initialized data segment(初始化了的數據段)開辟空間給a用;看見b,於是在uninitialized data segment(未初始化的數據段)開辟空間給b用;然後就開始執行我們的main了,看見了c,會在stack(棧)中開辟空間給c用,如果是new出來的對象是在heap(堆)分配空間。
類的一個對象和普通的int類型的數在本質上是一樣的,一個類就相當於int這樣的類型,只不過是用戶定義的罷了,所以,如果不是全局變數,那麼它的空間分配是在程序執行的過程中分配的,而不是像全局變數那樣是在程序執行之前分配的。編譯器分配空間的說法是不準確的,只能說是在編譯的時候規劃好這個變數需要多少空間,只有cpu真正執行到這條語句時才會分配。而且構造函數的功能也不是分配空間啊,而是給對象的空間做初始化。
例如:
int main()
{
...
A a(3);// no.1
...//no.2
}
cpu運行到no.1這里,「啊,需要在stack中分配sizeof(A)大小的空間,好,我這就分配。Ok,分配好了。
它有初始化誒,那我就去調用A的構造函數吧!好,轉向代碼段里A的構造函數的位置,開始讀取命令執行,
。。。。A的構造函數執行完成。a也初始化好了。我又要跳回到no.2的位置繼續執行命令了。」
總的來說,編譯器只是決定這個變數需要多大的空間(如果它能確定的話,有些操作它就不能確定,比如new動態分配內存),真正的分配空間是在程序執行的時候才完成的。而構造函數是對這個分配了的內存做一些操作,給裡面填上數據。
建議你看編譯原理,操作系統的知識。
這個是我的理解,不對的大家多討論。

㈧ C語言源程序的編譯過程包括哪三個階段

編譯:將源程序轉換為擴展名為.obj的二進制代碼
連接:將obj文件進行連接,加入庫函數等生成可執行文件
運行:執行可執行文件,有錯返回修改,無錯結束

㈨ 程序的編譯鏈接過程

stdio.h 只是一個函數聲明的頭文件, 實現在已經編譯好的庫文件中,一般情況 IDE 會自動連接標准庫,不需要你管。

㈩ c++在進行c編譯時,為什麼要聲明extent c

你要知道 有的時候 需要用c編譯的程序調用c++編譯的庫或者c++源碼裡面的函數和類,
但是c和c++對於函數的處理是不同的,
比如說c編譯函數的話,如void fun()處理後之後可能就是fun,
然而c++的話,可能會在前面加上很多修飾的前綴,就不是fun了,可能是什麼g_fun,
具體我也不清楚,
由於c和c++對函數的處理方式不同的話,你在c++寫函數要讓c語言可以調用,那麼就要加個東西表示要按c的方式編譯函數,這就是加個extern "c"了,在c++語言裡面使用c方式的函數,聲明的時候也要加上extern "c"告訴編譯器按c的方式去查找這個函數,否則的話可能會出現鏈接錯誤,

具體的詳細說明可以去查詢相關資料啊。。。c++ primer 4裡面的最後一章好像有點說明,講的簡單明了,可以去看看哦。。。

關於文件後綴名是c還是cpp的,在vc6和vs2008等下面都是 分別按照對應語言處理的,要讓編譯器只按照c語法處理的話,要把後綴改成.c的,否則默認情況.cpp的話,即使源碼裡面是純c的語法,還是會按照c++處理的,所以編譯方式還是c++的,就體現不出extern "c"的作用了,要想體現出作用的話,可以建立.c和.cpp的文件或者工程嘗試下。。。

閱讀全文

與在編譯過程中聲明屬於哪個過程相關的資料

熱點內容
優信二手車解壓後過戶 瀏覽:58
Windows常用c編譯器 瀏覽:776
關於改善國家網路安全的行政命令 瀏覽:830
安卓如何下載網易荒野pc服 瀏覽:650
javainetaddress 瀏覽:100
蘋果4s固件下載完了怎麼解壓 瀏覽:996
命令zpa 瀏覽:281
python編譯器小程序 瀏覽:940
在app上看視頻怎麼光線調暗 瀏覽:536
可以中文解壓的解壓軟體 瀏覽:588
安卓卸載組件應用怎麼安裝 瀏覽:908
使用面向對象編程的方式 瀏覽:335
程序員項目經理的年終總結範文 瀏覽:924
內衣的加密設計用來幹嘛的 瀏覽:428
淮安數據加密 瀏覽:289
魔高一丈指標源碼 瀏覽:979
松下php研究所 瀏覽:166
c回調java 瀏覽:396
夢幻端游長安地圖互通源碼 瀏覽:742
電腦本地文件如何上傳伺服器 瀏覽:309