Работа с указателями FAR в библиотеке кода для нескольких встроенных платформ

Я пытаюсь поддерживать библиотеку кода с примерами для нескольких встроенных платформ. Мне нужно поддержать концепцию "дальних" (не 16-битных) указателей для некоторых параметров функции.

Я подумал, что у меня есть хорошее решение, указав макрос FAR как __ far на некоторых платформах и ничего на платформах с 32-битными указателями (встроенный Linux, Win32 и т. Д.). С помощью этого макроса я мог легко определить указатели как 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 недостаточно для компиляции функции в почти память - мне нужно обернуть ее в прагмы.

Итак, кто-нибудь видел более хорошее решение, чем моя идея макроса FARPTR ?

7
задан tomlogic 9 June 2011 в 18:44
поделиться