包括数据类型之间的斗争

Include fight between data types

本文关键字:斗争 之间 数据类型 包括      更新时间:2023-10-16

很抱歉标题不好,我会尝试更好地描述我的问题。

我使用实时操作系统。由于我的任务是测试新功能,而我们的主要RTOS尚不支持它,因此我将基于另一个(直到现在尚未使用(RTOS制作原型。 这个新的RTOS带来了自己的头文件,它托管了许多typedefs来生成缩写,如ULONG,BOOL,INT等。

在我们的代码库中,有一些 typedef 可以保证,例如,一个无符号的长整型正好是 4 个字节。根据我们的样式指南,这些新类型将用于我们生产的任何界面。
不幸的是,这些typedefs与新RTOS(ULONG,INT,BOOL,...(的名称相同。
例如,破坏构建的事情是,例如,BOOL曾经被声明为无符号char,一次被声明为int.
这会导致使用BOOL和其他不同类型的某些函数标头损坏。

我的问题是,我怎样才能使这两个中的一个成为"主"标头,从而更喜欢它的 typedefs 而不是另一个头文件的 typedefs?
您还认为还有哪些其他方法可以划分这两个标头?

由于我只在新的RTOS上实现了原型,因此更改基本类型被视为不太受欢迎的解决方案。 任何帮助,感谢您,如果您需要进一步澄清,请告诉我!

编辑:好的,这里有一些代码可以进一步澄清:

RTOS_typedefs.h

...
typedef void VOID;
typedef unsigned char BOOL;
typedef int INT;
...


ownCodeBase_typedefs.h

...
#define void VOID
typedef int BOOL;
typedef int INT;

现在如您所见,INT typedef 是相同的,不会造成麻烦。
在某些文件中,Void 定义与 void typedef 发生冲突,预处理器生成以下内容:

typedef void void;

。这将生成编译器错误。
Bool typedef 破坏了我的函数头,因为在一个文件中使用了 RTOS 版本,而在另一个文件中使用了我们代码库中的 typedef。编译器生成两个不同的签名,链接器找不到其中一个签名的定义。->抛出另一个错误

使用一些预处理器(ab(使用手动覆盖typedefs是一个选项。

/* Rename the OS version of 'BOOL' to something else */
#define BOOL osBOOL
#include <osheader>
#undef BOOL 
/* When myheader.h is included, BOOL is still free to be typedef'd'. */
#include myheader.h

手动覆盖将防止 RTOS 覆盖应用程序中 BOOL 的含义。它的 typedef bool 将改为 typedefosBOOL并且BOOL的任何内部使用都将替换为osBOOL

对要覆盖现有操作系统定义的标头类型的任何其他原始缩写重复该范例。

请注意,也可以反其道而行之。如果您有一个包含在所有项目文件中的常规标头,则可以在包含其标头后将宏BOOL#define到 RTOS未保留的内容。然后当你运行typedef BOOL char预处理器将首先将BOOL转换为myBOOL,以及在包括标头在内的代码文件中使用它的每次使用。

另请参阅此问题以获取一些相关想法。