抱歉标题不好,我会尝试更好地描述我的问题..
我使用的是实时操作系统。由于我有测试新功能的任务,而我们的主要RTOS还不支持它,我将基于另一个(直到现在未使用)RTOS制作原型。 这个新的RTOS带来了自己的头文件,它承载了许多typedef来生成ULONG,BOOL,INT等缩写...
在我们的代码库中,有一些typedef可以保证,例如,unsigned long恰好是4 Bytes。根据我们的风格指南,这些新类型将用于我们生产的任何界面。不幸的是,那些typedef的名称与新RTOS(ULONG,INT,BOOL,...)的名称相同。
破坏性的东西是,BOOL例如曾经被声明为unsigned char而一次被声明为int
这导致一些函数头的损坏,其中使用BOOL和其他不同类型。
我的问题是,如何让这两个中的一个成为" main"标题,因此喜欢它的typedef而不是其他标题文件?
还有什么其他方法可以划分这两个标题?
由于我只在新的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。编译器生成两个不同的签名,链接器无法找到其中一个的定义。 - >抛出另一个错误
答案 0 :(得分:1)
使用一些预处理器(ab)使用的typedef手动覆盖是一个选项。
/* 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的含义。它的BOOL类型定义将改为输入osBOOL
,BOOL
的任何内部用途都将替换为osBOOL
。
对您希望覆盖现有操作系统定义的标头类型的任何其他原始缩写重复范例。
请注意,也可以进行相反的操作。如果您的所有项目文件中都包含一个常规标题,那么在包含其标题后,您可以#define
宏BOOL
向RTOS保留 保留的内容。然后,当您运行typedef BOOL char
时,预处理器将首先将BOOL
转换为myBOOL
,以及在包含标头的代码文件中使用它。
另请参阅this question了解相关提示。