簡體   English   中英

ANSI C (C89) 中的 Stdint.h

[英]Stdint.h in ANSI C (C89)

我最近對從編寫 C99 代碼轉換為編寫普通的 ANSI C (C89) 產生了興趣,因為該語言的新功能不值得用 ANSI C 編寫它的極端可移植性和可靠性。 我認為從 C99 過渡到 C89 時會錯過的最大功能之一是stdint.h標准庫文件; 或者我是這么想的。 根據這個站點,C89 標准中沒有stdint.h文件,這也是我在Wikipedia上找到的。 我想確保情況確實如此,所以我編寫了一個最小的測試程序,當在 GCC 和 Clang 中提供標志-ansi-pedantic-errors時,我預計它不會編譯;

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    printf("The size of an int8_t is %ld.\n",  sizeof(int8_t));
    printf("The size of an int16_t is %ld.\n", sizeof(int16_t));
    printf("The size of an int32_t is %ld.\n", sizeof(int32_t));
    printf("The size of an int64_t is %ld.\n", sizeof(int64_t));

    printf("The size of a uint8_t is %ld.\n",  sizeof(uint8_t));
    printf("The size of a uint16_t is %ld.\n", sizeof(uint16_t));
    printf("The size of a uint32_t is %ld.\n", sizeof(uint32_t));
    printf("The size of a uint64_t is %ld.\n", sizeof(uint64_t));

    return 0;
}

但是,我發現的不是編譯器錯誤,也不是警告,而是已編譯的程序,因為它在任一編譯器上都可以正常工作。 我假設這不是編譯器中的錯誤,output,作為參考:這是人們對工作 C99 實現的期望:

The size of an int8_t is 1.
The size of an int16_t is 2.
The size of an int32_t is 4.
The size of an int64_t is 8.
The size of a uint8_t is 1.
The size of a uint16_t is 2.
The size of a uint32_t is 4.
The size of a uint64_t is 8.

我對這個“功能”有幾個問題。

  • 我應該能夠依賴為 C89 程序提供的stdint.h header 嗎?
  • 如果沒有,我必須采取哪些步驟來創建與stdint.h功能相同的 header ?
  • 在 C99 之前的那個時代,程序員是如何在與平台無關的庄園中解決在他們的程序中為整數提供可靠大小的問題的?

我應該能夠依賴為 C89 程序提供的 stdint.h header 嗎?

不。你說你選擇 C89 是出於便攜性的原因,然后你首先想到的是非便攜擴展......

如果不是,我必須采取哪些步驟來創建與 stdint.h 功能相同的 header?

在 C99 之前的那個時代,程序員是如何在與平台無關的庄園中解決在他們的程序中為整數提供可靠大小的問題的?

例如在這個答案中使用大量宏。 如果是 C89,則為給定平台鍵入定義typedef中存在的所有名稱。 否則,如果標准 C,則只需包含 stdint.h。

因此,您需要自己的“notstdint.h”,其中包含所有這些,然后您必須將其移植到 integer 大小不同的每個系統。 是的,這使得 C89 的便攜性低於標准 C。

在 C89 時代,為微型計算機編寫代碼時,可以簡單地使用:

typedef unsigned char  uint8;
typedef signed char    int8;
typedef unsigned short uint16;
typedef signed short   int16;
typedef unsigned long  uint32;
typedef signed long    int32;

當時, int可能是 16 位或 32 位,但所有其他類型在可以處理它們的系統(包括所有微型計算機)的常見實現上都具有指示的大小。 16 位系統的編譯器將允許從int*新轉換為short*的指針訪問int類型的對象,因此無需擔心int16_t應該是short還是int 同樣,對於 32 位系統,將允許從int*新轉換為long*的指針訪問int類型的對象,因此不必擔心int32_t應該是int還是long

暫無
暫無

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

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