我有两个编译器,一个识别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)
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位.
有几种不同的方法可以解决这个问题.在需要可移植的开源项目中,常见的解决方案是使用"配置脚本"来运行以设置构建系统.然后它会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_t和uint16_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)