簡體   English   中英

將 uint8_t 而不是 uint32_t 傳遞給函數(在 C 中)

[英]Passing uint8_t instead of uint32_t into a function (in C)

查看一些代碼(用 C 語言編寫)我偶然發現了以下內容:

//we have a parameter

uint8_t num_8 = 4;

//we have a function

void doSomething(uint32_t num_32) {....}

//we call the function and passing the parameter

doSomething(num_8);

我無法理解這是否是正確的函數調用。 這是一個演員還是只是一個錯誤?

一般來說,我知道在 C/C++ 語言中只有變量的副本被傳遞到函數中,但是,我不確定實際發生了什么。 編譯器是否在堆棧上分配 32 位(用於傳遞的參數),將所有位歸零並在復制參數之后立即分配?

誰能給我指出解釋參數傳遞背后機制的資源?

由於函數聲明包含參數類型列表,因此編譯器知道預期參數的類型。 然后它可以隱式地將實際參數轉換為預期的類型。 事實上,編譯器處理函數調用就像是:

doSomething((uint32_t) num_8);

曾經使用過(不太)好的 K&R C 的老程序員應該記得,pre-ansi C 只有標識符列表,並且沒有明確聲明參數的類型。 在那些日子里,我們必須顯式地轉換參數,當我們忘記時,我們沒有編譯時警告,而是在執行時出錯。

在匯編語言或機器指令中精確翻譯轉換和調用的方式只是一個實現細節。 重要的是一切都必須發生,就好像編譯器聲明了一個臨時uint32_t變量已經將uint8_t值強制轉換為臨時變量並將臨時變量傳遞給函數一樣。 但是優化編譯器通常使用寄存器來傳遞單個整數參數。 根據處理器的不同,它可以將累加器歸零,加載低位中的單個字節並調用函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM