在我的工作中,我为许多平台(Windows,嵌入式微控制器,Arduino等(使用许多不同的编译器。现在我想编写一个应该适用于所有它们的通用例程,但我遇到了数据类型冲突。它主要是低级的东西,所以我想使用"字节"、"单词"、"布尔"等类型。
对于某些编译器,这些类型尚未定义,但对于某些编译器,它们已定义,在这些情况下,将导致冲突类型的错误。
我了解到 typedef 高于 #define。在这个问题上,很明显没有办法制作条件类型定义。
我已经想到使用独特的类型,例如:
typedef unsigned char mybyte
typedef unsigned short int myword
etc...
但这会使我的源代码看起来非常丑陋恕我直言。
所有平台都应该支持bool
,因为它是 C++ 中内置类型的保留关键字。
我所知道的唯一一个byte
和word
的平台是Arduino。它们只是分别uint8_t
和unsigned int
的类型定义别名。(来源(
如果你有现有的使用byte
和word
的Arduino代码,最简单的解决方案是检查你的代码是否在Arduino环境中运行,如果不是这种情况,则自己定义Arduino类型:
#ifdef ARDUINO
#include <Arduino.h>
#else
#include <cstdint>
typedef uint16_t word; // or unsigned int, depending on your needs
typedef uint8_t byte;
#endif
但是,我的首选解决方案是在需要特定位数的位时直接使用 stdint.h
的标准整数。使用byte
和word
只会增加混乱,因为它是非标准的。 uint16_t
确切地告诉你它是什么,你确切地知道最大可能的值是什么,以及它是否被签名。