我正在尝试为多个嵌入式平台维护带有示例的代码库.我需要支持一些函数参数的"far"(非16位)指针的概念.
我认为我有一个很好的解决方案,在一些平台上定义宏FAR
,__far
在32位指针(嵌入式Linux,Win32等)的平台上没有.使用该宏,我可以轻松地将指针定义为somestruct_t FAR *foo
.
但后来我开始与飞思卡尔处理器的工作,他们的编译器需要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
Run Code Online (Sandbox Code Playgroud)
最后一个杀了我 - 返回类型内的限定符表示近函数?!而且我最近了解到添加__near
它并不足以将函数实际编译到近存储器 - 我需要将它包装在pragma中.
那么,有没有人看到比我的FARPTR
宏观想法更好的解决方案?
飞思卡尔处理器的使用与标准类型限定符(例如 )更加一致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
Run Code Online (Sandbox Code Playgroud)
那么你的声明将如下所示:
DECLARE_FARPTR( somestruct_t, foo ) ;
Run Code Online (Sandbox Code Playgroud)
或者在带有指针参数的函数原型中:
void fn( DECLARE_FARPTR( somestruct_t, foo ) ) ;
Run Code Online (Sandbox Code Playgroud)
或返回远指针的函数:
DECLARE_FARPTR( somestruct_t, fn( void ) ) ;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它很快就会变得难以阅读,并且通常最好避免使用类似声明性函数的宏。