簡體   English   中英

如何檢查uint8_t是否作為類型而不是unsigned char存在?

[英]How to check if uint8_t exists as a type, instead of unsigned char?

我有兩個編譯器,一個識別uint8_t(GCC ARM-EABI),另一個不識別(瑞薩M16標准工具鏈)。

瑞薩工具鏈不符合ANSI C標准,因此您可以拋棄。 因此uint8_t,uint16_t,...未定義為現有類型。

為了保持可移植性,我想擁有相同的類型(最好是uint8_t,因為int的含糊不清)。

我的平台也是不同大小的處理器(ARM是32位,瑞薩是16位)。 導致int成為不同的值。

有沒有辦法檢查uint8_t是否作為一種類型存在?

如果沒有,請將它(以及其他uint16_t,uint32_t,...)聲明為一種類型?

有沒有辦法檢查uint8_t是否作為一種類型存在?

采用:

#include <stdint.h>

#ifdef UINT8_MAX
...
#endif

uint8_t不是內置類型,它在stdint.h中定義。 所以這不是編譯器“識別”uint8_t的問題,而只是一個使stdint.h可用的情況。

如果您的工具鏈不提供stdint.h,您可以使用編譯器文檔輕松提供自己的實現,以確定與特定大小相對應的內置類型。 在沒有stdint.h的工具鏈上,你只需提供自己的項目,在工具鏈上使用stdint.h就可以了。 這樣代碼(除了stdint.h本身)在各個平台上都是相同的 - 你不需要有條件地定義uint8_t。

您可能遇到的一個問題(例如某些TI DSP)是內存可能不是8位可尋址的,而char將是16位(或更大)。 在那種情況下,根本不支持uint8_t或任何8位整數類型。 char始終是特定平台的最小數據類型,但可能大於8位。

有幾種不同的方法可以解決這個問題。 在需要可移植的開源項目中,常見的解決方案是使用“配置腳本”來運行以設置構建系統。 然后它會像某些config.h或類似設置或未設置的HAVE_UINTX_TYPES一樣[這是“配置腳本”的結果之一,並執行以下操作:

#include "config.h"
...
#ifndef HAVE_UINTX_TYPES
#include "uintx_types.h"
#endif

在一個較少“需要在幾乎任何東西上運行”的系統中,你可以通過簡單地將-DHAVE_UINTX_TYPES作為編譯器標志的一部分來解決同樣的問題。 並且由於你(可能)有一些構建系統的一部分設置了不同的編譯選項,為兩個不同的構建選擇了不同的編譯器等,這應該不是一個很大的問題。

假設你很高興你的unsigned char確實是8位,你也可以有一個uintx_types.h包含這樣的東西:

typedef unsigned char  uint8_t; 
typedef unsigned short uint16_t;
typedef unsigned long  uint32_t; 

另一個選擇是不直接使用uint8_tuint16_t等,但是有自己的定義[並且這些定義取決於“是ARM或Renesas”的適當構建設置,例如通過使用不同的include選項]:

ARM / types.h中:

typedef unsigned char  u_int8;
typedef unsigned short u_int16;
typedef unsigned int   u_int32;

瑞薩/ types.h中:

typedef unsigned char  u_int8;
typedef unsigned int   u_int16;
typedef unsigned long  u_int32;

uint8_t要點是它不會存在於不支持8位無符號整數類型的平台上。 如果unsigned char是可接受的,即使它可能大於8位, 也不要使用uint8_t 在一個平台上使用unsigned char在另一個平台上使用uint8_t沒有任何好處。

如果uint8_t不存在,則可能是因為實現不符合C99,或者因為它沒有滿足要求的類型。 后者可能意味着CHAR_BIT > 8 (在嵌入式系統之外很少見)。

#if __STDC_VERSION__ >= 199901L
#include <stdint.h>
#ifdef UINT8_MAX
// uint8_t exists
#else
// uint8_t doesn't exist in <stdint.h>
#else
// uint8_t probably doesn't exist because this isn't a C99 or better compiler
#endif

不完全符合C99的實現可以提供<stdint.h>uint8_t作為擴展。 這很難被發現,因為沒有條件的#include指令; #include包括請求的標頭或失敗。

但是你可以通過使用某種配置腳本走出C語言來檢測它。 如果這編譯:

#include <stdint.h>
uint8_t dummy;

然后uint8_t存在; 否則它沒有。

暫無
暫無

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

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