Кто-нибудь может предложить более хороший способ написания следующего фрагмента кода?
Я бы хотел не использовать boost::time
, так как это вызывает проблемы со связыванием, и не могу использовать strptime()
, потому что я нахожусь на msvc.
#include <ctime>
int strtomonth(string s)
{
const char *months[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
for (int i=0;i<12;i++)
if (strcmp(months[i],s.c_str())==0)
return i;
return -1;
}
time_t get_compilation_time()
{
stringstream s;
s << __TIMESTAMP__; // formatted like "Tue Dec 6 13:42:54 2011"
string weekday,month;
int day,h,m,sec,year;
char colon;
s >> weekday >> month >> day >> h >> colon >> m >> colon >> sec >> year;
tm compile_time;
compile_time.tm_sec = 0;
compile_time.tm_min = 0;
compile_time.tm_hour = 0;
compile_time.tm_mday = day;
compile_time.tm_mon = strtomonth(month);
compile_time.tm_year = year-1900;
compile_time.tm_isdst = 0;
compile_time.tm_wday = 0;
compile_time.tm_yday = 0;
time_t cmptime = mktime(&compile_time);
return cmptime;
}
(Я ценю, что в этом случае я мог бы сделать шаг перед сборкой в python или аналогичный, чтобы создать «buildtime.h» и сэкономить мне вычисления во время выполнения, но так как это теперь работает, и накладные расходы не проблема, я буду придерживаться его).
Но ... инициализация структуры в стиле C с неопределенным поведением, если я ошибаюсь, ссылки на то, что должно быть чисто функциональным фрагментом кода, объявление переменных, которые отбрасываются, разбор строк месяца себя . .. тьфу! Есть ли лучший способ?