如何检查uint8_t是否作为类型而不是unsigned char存在?

Ash*_*lax 3 c c++ embedded

我有两个编译器,一个识别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,...)声明为一种类型?

oua*_*uah 10

有没有办法检查uint8_t是否作为一种类型存在?

使用:

#include <stdint.h>

#ifdef UINT8_MAX
...
#endif
Run Code Online (Sandbox Code Playgroud)


Cli*_*ord 7

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位.

  • @Ashitakalax:所以做一个。您可能只需要实现基本类型的一个子集来编译大多数代码,但您也可以编写一个完全符合 ISO C99 的实现,其中包含完整的专业类型和宏:[ref](http://www.ceplusplus.com /reference/cstdint/)。[这是 VC++ 6 的示例实现](http://msinttypes.googlecode.com/svn/trunk/stdint.h),它当然是 32 位的,但您只需要更改一些 typedef 以适应 16 位目标。 (2认同)

Mat*_*son 6

有几种不同的方法可以解决这个问题.在需要可移植的开源项目中,常见的解决方案是使用"配置脚本"来运行以设置构建系统.然后它会HAVE_UINTX_TYPES设置或不设置某些config.h或类似的东西[这是"配置脚本"的结果之一,并执行以下操作:

#include "config.h"
...
#ifndef HAVE_UINTX_TYPES
#include "uintx_types.h"
#endif
Run Code Online (Sandbox Code Playgroud)

在一个较少的"需要在几乎任何东西上运行"系统中,你可以通过简单地将一个-DHAVE_UINTX_TYPES标志作为编译器的一部分来解决同样的问题.并且由于你(可能)有一些构建系统的一部分设置了不同的编译选项,为两个不同的构建选择了不同的编译器等,这应该不是一个很大的问题.

假设你很高兴你unsigned char的确是8位,你也可以拥有uintx_types.h包含这样的东西:

typedef unsigned char  uint8_t; 
typedef unsigned short uint16_t;
typedef unsigned long  uint32_t; 
Run Code Online (Sandbox Code Playgroud)

另一种选择是不使用uint8_tuint16_t等直接,但有自己的定义,并让这些取决于适当的构建设置"是ARM或瑞萨",例如,通过使用不同的选项包括]:

ARM/types.h中:

typedef unsigned char  u_int8;
typedef unsigned short u_int16;
typedef unsigned int   u_int32;
Run Code Online (Sandbox Code Playgroud)

瑞萨/ types.h中:

typedef unsigned char  u_int8;
typedef unsigned int   u_int16;
typedef unsigned long  u_int32;
Run Code Online (Sandbox Code Playgroud)