繁体   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