Как вы упомянули в своем вопросе, операторы #iffined (__ xxxxx__) фактически не выполняются на микроконтроллере. Это директивы препроцессора. Операторы if решают, какой код передать фактическому компилятору, а какие пропустить.
Что вы можете сделать, это написать свой код для чтения из eeprom, но для раздела кода, который отличается между микроконтроллерами ( Я бы порекомендовал отдельную функцию для каждой), которую вы можете выбрать во время компиляции.
Например
#ifdef AVR_MICROCONTROLLER
read_from_eeprom(...)
{
code for the avr chip
}
#else // I'm assuming there's no other options besides avr and esp
read_from_eeprom(...)
{
code for esp chip
}
#endif
Затем при компиляции используйте флаг -D, чтобы указать, что вы используете AVR или пропустите тег для esp.
gcc ... -D AVR_MICROCONTROLLER ...
Я чувствую, что причина, по которой вы задали этот вопрос, может быть вызвана путаницей в отношении происхождения тегов __AVR_ATmega1280__, et c .... По сути, они не являются ключевыми словами, используемыми компилятором, чтобы решить, для какого чипа компилироваться. Они созданы людьми, которые написали исходный файл, и они используются для переносимости, поэтому один и тот же файл может использоваться на разных платформах / процессорах. В своем ответе я использовал тег командной строки для определения тега AVR_MICROCONTROLLER. Другие проекты (например, прошивка Marlin, работающая на arduinos) также имеют конфигурационные файлы, полные операторов определения, которые можно использовать для точной настройки компиляции кода. Короче говоря, да, то же самое можно сделать для других микроконтроллеров, и вы сделаете это, написав свой собственный оператор препроцессора if, а затем выбрав, какие параметры / переменные должны быть установлены во время компиляции, в зависимости от чипа, на котором вы хотите запустить код.