如何编写与编译器无关的通用代码?

时间:2019-06-19 09:22:38

标签: c++ c

在我的工作中,我使用用于许多平台(Windows,嵌入式微控制器,Arduino等)的许多不同的编译器。 现在,我想编写一个通用例程,该例程应适用于所有这些例程,但是我与数据类型发生冲突。 它主要是低级的东西,所以我想使用'byte','word','bool'等类型。

对于某些编译器,这些类型尚未定义,但是对于某些编译器,在这些情况下,将导致类型冲突的错误。

我了解到typedef比#define更受青睐。 并且在this question中明确指出,没有办法进行条件typedef。

我已经考虑过使用唯一类型,例如:

typedef unsigned char mybyte
typedef unsigned short int myword
etc...

但这会使我的源代码看起来非常丑陋,恕我直言。

1 个答案:

答案 0 :(得分:5)

所有平台都应支持bool,因为它是C ++中内置类型的保留关键字。

我知道的唯一拥有byteword的平台是Arduino。它们分别是uint8_tunsigned int的类型定义别名。 (Source

如果您已有使用byteword的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的标准整数。使用byteword只会增加混乱,因为它是非标准的。 uint16_t会确切地告诉您它是什么,您确切地知道最大可能值是什么,以及是否有符号。