А может, кто подскажет, почему компилятор (xc8) не может
сгенерировать код для выражения
0x8000 | offsetof(tSomeStruct, element)
offsetof определяется так:
#define offsetof(type, member) ((size_t)(((char*)&((type *)1)->member)-1))
Вроде бы ничего необычного, но тем не менее не могёт.
В то время как арифметическую операцию - без проблем:
0x8000 + offsetof(tSomeStruct, element)
Не связано ли это с аппаратным ограничением (12-битная адресация памяти)? Типа компилятор понимает, что работаем с указателем на ячейку памяти и не знает куда сунуть 15й бит в условно 12-битный указатель (хотя переменная, инициируемая offsetof-ом - 16 битная).