【发布时间】:2011-06-09 18:44:34
【问题描述】:
我正在尝试为多个嵌入式平台维护一个包含示例的代码库。对于某些函数参数,我需要支持“远”(非 16 位)指针的概念。
我认为我有一个很好的解决方案,在某些平台上将宏 FAR 定义为 __far,而在具有 32 位指针的平台(嵌入式 Linux、Win32 等)上则没有。使用该宏,我可以轻松地将指针定义为somestruct_t FAR *foo。
但后来我开始使用飞思卡尔处理器,他们的编译器需要 FAR 在星号和变量名之间。 (somestruct_t * __far foo)。
我想出的处理这种情况的最佳解决方案是将宏 FARPTR 定义为 __far *、* __far 或只是 *,具体取决于平台。这允许somestruct_t FARPTR foo。
有没有更清洁的解决方案? 特别是,我不喜欢阅读该代码的人看不到*。我还担心在函数声明方面会遇到问题。从飞思卡尔编译器帮助中获取大量此语法:
int __far *f(); // __far function returning a pointer to int
int * __far f(); // Function returning a __far pointer to int
int __near * __far f(); // __near function returning a __far pointer to int
最后一个杀了我——返回类型的限定符 inside 表示近函数?!而且我最近了解到,添加 __near 不足以将函数实际编译到内存附近——我需要将它包装在 pragma 中。
那么,有没有人看到比我的FARPTR 宏想法更好的解决方案?
【问题讨论】:
-
您的嵌入式系统真的如此受限以至于您不能仅使用“大”模型进行编译并让所有指针都远吗?这是最干净的解决方案。
-
这种语法似乎反映了
const处理指针的方式,__near反映了 C++ 的mutable。这对我来说似乎并不陌生。 -
不能将
FAR定义为__far(NEAR类似)的最初想法仍然有效吗?你只需要确保FAR/NEAR去飞思卡尔编译器想要它们的地方(喜欢与否)。在其他平台上,这些宏将是空格,因此它们在声明中的使用位置与它们无关。 -
@R:并非我使用过的所有嵌入式平台都支持“大型”模型。 @Michael Burr:问题是我需要支持一些在
*之前需要__far的平台和一些在之后需要它的平台。 -
你确定支持第一种语法的编译器不支持飞思卡尔语法吗?即有可能对此进行标准化。