Конечно скобочки в конструкции #if (__DATE__[2] == 'b') обязательны, но это не поможет.
Похоже на этапе выбора условий компиляций (директивы препроцессора #if, #ifdef) компилятор IAR ещё не сформировал макросы __DATE__ и __TIME__ и при любом обращении к ним в этих директивах пустые значения __DATE__ и __TIME__ никогда не включат нужную ветку условной компиляции.
Поэтому условие компиляции типа
#if (__DATE__[2] == 'b') //Feb
#define MONTH '0','2'
...
никогда не выполнится (т.к. на самом деле в директиве #if элемент макроса __DATE__[2] ещё равен 0)
Задание же макросов (директивы препроцессора #define) или символических констант (ключевое слово const происходит на следующем этапе компиляции, когда IAR уже сформировал макросы __DATE__ и __TIME__, тогда уже следующие конструкции прекрасно работают:
#define HOURS (__TIME__[0]), (__TIME__[1])
#define YEAR __DATE__[7], __DATE__[8], __DATE__[9], __DATE__[10];
__flash char BUILD_TIME[] = {__TIME__};
Исходя их вышесказанного, преобразовать __DATE__ в нужный формат на этапе компиляции никак не получится, по крайней мере, у меня не получилось. :laughing: Зато в runtime всё прекрасно работает. :yeah:
Следующий код возвращает дату компиляции в нужном нам формате 'DD.MM.YYYY' в строке TempStr:
char TempStr[11];
const char m1 = __DATE__[1];
const char m2 = __DATE__[2];
const char d1 = __DATE__[4];
const char d2 = __DATE__[5];
const char y1 = __DATE__[7];
const char y2 = __DATE__[8];
const char y3 = __DATE__[9];
const char y4 = __DATE__[10];
void BuildDateToTempStr (void )
{
/*
Формат макроса IAR '__DATE__'
на примере '30.01.2000':
'Jan 30 2000'
01234567890
Jan - 01
Feb - 02
Mar - 03
Apr - 04
May - 05
Jun - 06
Jul - 07
Aug - 08
Sep - 09
Oct - 10
Nov - 11
Dec - 12
*/
char M1, M2;
//••••••••••••••••••••••••
TempStr[0] = d1;
TempStr[1] = d2;
TempStr[2] = '.';
E1 = '0';
if (m1 == 'a' && m2 == 'n') M2 = '1';
if (m1 == 'e' && m1 == 'b') M2 = '2';
if (m1 == 'a' && m2 == 'r') M2 = '3';
if (m1 == 'p' && m2 == 'r') M2 = '4';
if (m1 == 'a' && m2 == 'y') M2 = '5';
if (m1 == 'u' && m2 == 'n') M2 = '6';
if (m1 == 'u' && m2 == 'l') M2 = '7';
if (m1 == 'u' && m2 == 'g') M2 = '8';
if (m1 == 'e' && m2 == 'p') M2 = '9';
if (m1 == 'c' && m2 == 't') {M1 = '1'; M2 = '0';}
if (m1 == 'o' && m2 == 'v') {M1 = '1'; M2 = '1';}
if (m1 == 'e' && m2 == 'c') {M1 = '1'; M2 = '2';}
TempStr[3] = M1;
TempStr[4] = M2;
TempStr[5] = '.';
TempStr[6] = y1;
TempStr[7] = y2;
TempStr[8] = y3;
TempStr[9] = y4;
//••••••••••••••••••••••••
TempStr[10] = 0;
}
m1 … y4 – обязательно!!! должны объявляться как константы через const.
Тогда условные операторы типа if (m1 == 'a' && m2 == 'n') в скомпилированный код вообще не включаются, т.к. сравнивать константу с константой нет смысла, поэтому в полученном коде элементам строки просто присваиваются реальные значения даты компиляции в нужном формате и всё!
Если же m1 … y4 объявить через #define, на этапе компиляции дата размещается в памяти данных и все обращения к ней как к памяти, в итоге скомпилированный код раз в 10 больше!.