gpt4 book ai didi

c - 处理多个嵌入式平台的代码库中的 FAR 指针

转载 作者:太空狗 更新时间:2023-10-29 17:11:29 25 4
gpt4 key购买 nike

我正在尝试为多个嵌入式平台维护一个带有示例的代码库。我需要为某些函数参数支持“远”(非 16 位)指针的概念。

我认为我有一个很好的解决方案,将宏 FAR 在某些平台上定义为 __far 而在具有 32 位指针的平台(嵌入式 Linux、Win32、 ETC。)。使用该宏,我可以轻松地将指针定义为 somestruct_t FAR *foo

但后来我开始使用 Freescale 处理器,他们的编译器需要 FAR 在星号和变量名之间。 (somestruct_t * __far foo)。

我想出的处理这种情况的最佳解决方案是将宏 FARPTR 定义为 __far ** __far或者只是 * 取决于平台。这允许 somestruct_t FARPTR foo

是否有更清洁的解决方案? 特别是,我不喜欢阅读该代码的人看不到*我也担心当它出现时我会遇到问题函数声明。从 Freescale 编译器帮助中获取大量此语法:

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

最后一个要了我的命——返回类型内部的限定符表示近函数?!我最近了解到,添加 __near 不足以实际将函数编译到内存附近——我需要将其包装在 pragma 中。

那么,有没有人看到比我的 FARPTR 宏想法更好的解决方案?

最佳答案

freescale 处理器的用法与标准类型限定符(如 const)更加一致,这种放置导致它引用指针而不是所指向的数据。也就是说,由于“远数据”而不是“远指针”是没有意义的,您可能会认为这无关紧要,但更大的一致性可能有助于一个更简单的编译器解析器。

你可以使用一些笨拙的东西,比如:

#if defined __SOME_ARCHITECTURE__

#define DECLARE_FARPTR( type, identifier ) type __far * identifier

#if defined __SOME_OTHER_ARRCHITECTURE__

#define DECLARE_FARPTR( type, identifier ) type * __far identifier

#else

#define DECLARE_FARPTR( type, identifier )

#endif

然后你的声明看起来像:

DECLARE_FARPTR( somestruct_t, foo ) ;

或者在一个接受指针参数的函数原型(prototype)中:

void fn( DECLARE_FARPTR( somestruct_t, foo )  ) ;

或返回远指针的函数:

DECLARE_FARPTR( somestruct_t, fn( void ) ) ;

如您所见,它很快变得难以阅读,声明式函数式宏通常是最好避免的事情。

关于c - 处理多个嵌入式平台的代码库中的 FAR 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6297672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com