【发布时间】:2017-07-25 11:23:29
【问题描述】:
抱歉标题不好,我会尝试更好地描述我的问题..
我使用实时操作系统。由于我的任务是测试一项新功能,而我们的主要 RTOS 还不支持它,我将基于另一个(直到现在还没有使用)RTOS 制作原型。 这个新的 RTOS 带来了自己的头文件,其中包含许多 typedef 来生成缩写,如 ULONG、BOOL、INT 等......
在我们的代码库中,有一些 typedef 可以保证,例如,一个 unsigned long 正好是 4 个字节。根据我们的风格指南,这些新类型将用于我们生产的任何界面。
不幸的是,这些 typedef 的名称与新 RTOS 中的相同(ULONG、INT、BOOL、...)。
破坏构建的事情是,例如 BOOL 曾经被声明为 unsigned char,一次被声明为 int。
这会导致某些使用 BOOL 和其他不同类型的函数头损坏。
我的问题是,我怎样才能使这两个头文件中的一个成为“主”头文件,从而更喜欢它的 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。编译器生成两个不同的签名,链接器找不到其中一个的定义。 -> 抛出另一个错误
【问题讨论】:
-
与其试图用文字墙来描述您的代码,不如向我们展示一个说明您的问题的代码 sn-p 会容易得多。
-
typedef 应该存在于单独的命名空间中,如果是这种情况,你不会有问题
-
将您的代码库类型定义放入您的命名空间。
-
CoryKramer,你说得对,我添加了一些代码来澄清一下。感谢您的提示!我知道使用单独的命名空间是一种解决方案,但我只是一个写论文的学生,代码库由 30 多个大模块组成。另外,我怕跟老板说团队下次不做产品,重构代码不会打动他们。
标签: c++ include header-files typedef