c函數與編譯
1. 函數長度是否影響c的執行速度或者編譯速度java中函數名很長,讀起來
函數名、變數名長度不會影響執行速度,編譯後的名稱不是源代碼中的名稱。對編譯速度的影響微乎其微,可以忽略不計。C語言出現的早,那時有個規定外部變數名最長6個字元。那時存儲空間小,源代碼也是佔用越少空間越好。另外,以前沒有自動補全功能,函數名、變數名短可以少打很多字,開發效率能高些。
現在,寫C完全可以像Java一樣使用長名稱,清晰易讀。
2. C語言中函數的地址在編譯時就分配好了,為什麼不會產生地址沖突運行時剛好那個地址有別的程序在用
函數的具體武理地址不是編譯的時候分配的,是運行的時候由系統分配的!如果你看一下生成的匯編代碼你就會發現進入函數時的操作是將返回地址壓棧後通過CALL跳轉到函數開頭處執行,壓棧的函數地址都是偏移量,實際地址在運行時通過基址加減偏移量得出。另外通常程序的內存空間是專用的,兩個程序的空間互不沖突,普通用戶程序不可以訪問其他程序的內存空間!
3. C/C++語言中編譯階段,編譯到 函數調用的語句時,是怎麼編譯的
函數體被編譯成對應的一段匯編代碼,在符號表中會生成一個函數名指向這段代碼的入口地址。所有調用此函數的地方都會被編譯成CALL 函數名指令,然後連接時將函數名替換為函數的入口地址。
4. C語言 調用數學庫函數時,編譯預處理命令為include math.h 。為什麼錯
#include <math.h>
5. 宏和函數的區別以及C語言的編譯鏈接過程
宏在編譯之前,需要進行預處理,將宏直接提換成宏定義的代碼,是直接替換,也就是說,在預處理之後,你再看代碼,發現宏定義已經被替換過來了,你看到是你定義之後的那一串代碼。
而函數,在編譯之後,有一系列調用函數的過程,比如,傳參,壓棧等,這部分是編譯器所做的。
C 語言編譯鏈接過程:
test.c(原始代碼) --> 預處理 --> test.i(經過預處理的)--> 編譯 --> test.s(匯編代碼)--> 匯編 --> test.o(目標文件,其實這部分已經是單個文件的完整二進制文件了,只是還不能執行,如果不懂這句話,可以再問我,其實這部分知識,平時也很少遇到) --> 鏈接 --> test (可執行文件,比如一個程序由3個代碼文件共同生成,那麼就會有3個.o格式目標文件,鏈接是把多個目標文件真正的聯系在一起,比如a.o 中使用了 b.o中的一個函數,那麼它們兩個之間的地址是如何確定的(同理,可引申到使用函數庫的問題,使用printf函數,也是需要鏈接器進行確定printf函數地址,才能知道如何調用。)這個就是鏈接器的作用)