Я пытаюсь поддерживать библиотеку кода с примерами для нескольких встроенных платформ. Мне нужно поддержать концепцию "дальних" (не 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
?