簡體   English   中英

標准整數如何從 <stdint.h> 編譯期間翻譯?

[英]How are standard integers from <stdint.h> translated during compilation?

在C語言中,通常(至少可能)使用相同的源代碼來針對不同的處理器體系結構。 處理器體系結構對整數大小的定義不同也很常見。 為了提高代碼的可移植性並避免整數大小的限制,建議使用C標准整數標頭。 但是,我對如何實際實現感到困惑。

如果我寫了一個為x86編寫的小C程序,然后決定將其移植到8位微控制器,那么微控制器編譯器如何知道如何將'uint32_t'轉換為其原生整數類型?

編寫C編譯器時有一些映射要求嗎? 就像,如果您的編譯器要與C99兼容,您需要有一個映射功能,用本機類型替換所有uint32_t?

謝謝!

通常<stdint.h>包含等價於

typedef int int32_t;
typedef unsigned uint32_t;

具有適合當前機器的實際類型選擇。

實際上,它通常比這復雜得多,具有大量額外的輔助頭文件和輔助預處理器宏,但效果是相同的:像uint32_t這樣的名稱最終都是真實的類型名稱,就像typedef定義的那樣。

您問“如果您的編譯器要與C99兼容,您需要具有映射功能嗎?”,答案基本上是“是”,但是“映射功能”可以只是編譯器編寫者在其分布式系統中選擇的特定類型。 stdint.h副本。 (要回答另一個問題,是的,至少有<stdint.h>副本與編譯器一樣多;沒有一個主副本或任何其他副本。)

一方面評論。 您說:“為提高代碼的可移植性並避免整數大小的限制,建議使用C標准整數頭。” 真正的建議是, 當您有特殊要求(例如,具有精確類型的尺寸)時 ,請使用該標頭。 如果出於某種原因您需要正好為32位的帶符號類型,則一定要使用stdint.h int32_t 但是大多數時候,您會發現像intlong這樣的“普通”類型非常好。 請不要讓任何人告訴您,您必須為聲明的每個變量選擇一個確切的大小,並使用stdint.h的類型名稱進行聲明。

通過#if#ifdef等條件預處理指令可以實現不同體系結構的處理。 例如,在GNU / Linux平台上,它可能看起來像:

# if __WORDSIZE == 64
typedef long int        int64_t;
# else
__extension__
typedef long long int       int64_t;
# endif

沒有魔術發生,以“映射”或“翻譯”的形式出現: stdint.h僅包含typedef語句的列表。 區別在於代碼生成器,而不是編譯器前端。

對於8位目標,代碼生成器將使用本機指令對本機支持的任何類型進行算術運算(也許有16位add指令)。 對於其余部分,它將插入對庫例程的調用以實現更大的數據類型。

8位編譯器的RTL包含諸如“ long_add”,“ long_subtract”等例程的情況並不少見。

暫無
暫無

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

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