Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检查uint8\u t是否作为类型而不是无符号字符存在?_C++_C_Embedded - Fatal编程技术网

C++ 如何检查uint8\u t是否作为类型而不是无符号字符存在?

C++ 如何检查uint8\u t是否作为类型而不是无符号字符存在?,c++,c,embedded,C++,C,Embedded,我有两个编译器,一个能识别uint8_t(GCC ARM-EABI),另一个不能识别uint8_t(Renesas M16标准工具链) Renesas工具链不符合ANSI C,因此您可以将其丢弃。所以,你的8,16,。。。未定义为现有类型 为了保持可移植性,我希望使用相同的类型(最好是uint8_t,因为int的模糊性) 另外,我的平台是不同大小的处理器(ARM是32位的,Renesas是16位的)。使int为不同的值 有没有办法检查uint8_t是否作为一个类型存在 如果不是,则将其(以及其他

我有两个编译器,一个能识别uint8_t(GCC ARM-EABI),另一个不能识别uint8_t(Renesas M16标准工具链)

Renesas工具链不符合ANSI C,因此您可以将其丢弃。所以,你的8,16,。。。未定义为现有类型

为了保持可移植性,我希望使用相同的类型(最好是uint8_t,因为int的模糊性)

另外,我的平台是不同大小的处理器(ARM是32位的,Renesas是16位的)。使int为不同的值

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

如果不是,则将其(以及其他uint16、uint32等)声明为类型

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

使用:

#包括
#ifdef UINT8U最大值
...
#恩迪夫

uint8\u t的要点是,在不支持正好为8位的无符号整数类型的平台上,它将不存在。如果
无符号字符
是可接受的,即使它可能大于8位,则不要使用
uint8\t
。在一个平台上使用
unsigned char
和在另一个平台上使用
uint8\u t
没有任何好处。

如果
uint8\u t
不存在,要么是因为实现不符合C99,要么是因为它没有满足要求的类型。后者可能意味着
CHAR\u BIT>8
(这在嵌入式系统之外是非常罕见的)


然后
uint8\u t
存在;否则就不行了。

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

#include "config.h"
...
#ifndef HAVE_UINTX_TYPES
#include "uintx_types.h"
#endif
typedef unsigned char  uint8_t; 
typedef unsigned short uint16_t;
typedef unsigned long  uint32_t; 
在一个“几乎需要在任何东西上运行”的系统中,您可以通过简单地将
-DHAVE\u UINTX\u类型作为编译器标志的一部分来解决相同的问题让构建系统的某些部分设置不同的编译选项,选择不同的编译器,等等,对于两个不同的构建,这应该不是一个需要添加的大问题

假设你很高兴你的
无符号字符
确实是8位,你也可以有一个
uintx\u types.h
包含如下内容:

#include "config.h"
...
#ifndef HAVE_UINTX_TYPES
#include "uintx_types.h"
#endif
typedef unsigned char  uint8_t; 
typedef unsigned short uint16_t;
typedef unsigned long  uint32_t; 
另一个选项是不直接使用
uint8\u t
uint16\u t
等,而是有自己的定义[并且这些定义取决于“是ARM还是Renesas”的适当构建设置,例如通过使用不同的包含选项]:

臂/类型。h:

typedef unsigned char  u_int8;
typedef unsigned short u_int16;
typedef unsigned int   u_int32;
Renesas/types.h:

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

uint8_t
不是内置类型,它是在stdint.h中定义的。因此,这不是编译器“识别”uint8_t的问题,而是使stdint.h可用的简单情况

如果您的工具链不提供stdint.h,您可以轻松地提供自己的实现,使用编译器文档来确定与特定大小相对应的内置类型。在没有stdint.h的工具链上,您只需在没有stdint.h的工具链上为项目提供自己的实现。这样,代码(除了stdint.h本身)在不同平台上是相同的-您不需要有条件地定义uint8_t


您可能会遇到的一个问题(例如在某些TI DSP上)是,内存可能不是8位可寻址的,而字符将是16位(或更大)。在这种情况下,将根本不支持uint8\u t或任何8位整数类型。对于特定平台,字符始终是最小的数据类型,但可能大于8位。

Renesas工具链中是否存在
uint\u至少8\u t
std::is\u same::value
。制作一个包含始终的标头,如果存在,则定义这些类型当前的编译器是Renesas,其他方面什么也不做。我不认为uint至少存在于8位,也不存在于随机平台上,而这些平台只是因为一些随意的其他原因而没有实现它——尽管它的存在是它在该体系结构上工作的标志,但它的缺失并不能证明处理器没有8位功能。缺失是专业的其中,实现要么不符合C标准,要么
CHAR\u BIT
大于8。@R..或者实现符合C89。我的平台支持8位无符号CHAR,但不支持uint8\t。建议扩展此正确答案以处理OP的第二个问题“如果不符合,请将其声明为类型(…)”原来我的编译器真的很烂。不支持stdint.h文件。8位,但stdint.h不被识别。@Ashitakalax:那就做一个吧。你可能只需要实现基本类型的一个子集就可以编译大多数代码,但你也可以编写一个完全符合ISO C99的实现,包含完整的专业类型和宏:,这是很有可能的se 32位,但您只需要更改一些typedef以适应16位目标。是的,我计划在这个设备上创建一个特定于文件的文件。我只是不确定没有额外的文件是否有简单的方法来完成它。@Ashitakalax:有什么比只做一次,然后在以后的所有项目中使用它更简单的方法吗?看到我的平台不支持uintN\U吗我必须实现某种检测。配置脚本不是一个好主意,尽管它与构建系统有巨大的差异,并且有自己的内置编译器。但是我可以添加一个小的头文件来声明这些类型,用于Renesas。Gwah darn dumb编译器。@Ashitakalax:这不是平台支持的问题-这些类型是在头文件中定义的文件,您可以创建任何您想要的头文件,如果您碰巧将其称为stdint.h,那么您的所有代码都将独立于平台和工具链。stdint.h中没有任何内容不能使用C89编译器实现。@Ashitakalax:I
typedef unsigned char  u_int8;
typedef unsigned int   u_int16;
typedef unsigned long  u_int32;