С++ надежный способ получить QDateTime для сборки

Ранее у меня был вопрос о __DATE__

Я хочу использовать __DATE__, чтобы получить время сборки. Продукт будет скомпилирован на системах с другой локалью. Формат для __DATE__ всегда одинаков? Моя цель — получить время сборки от __DATE__, и я хочу убедиться, что он работает на любой системе. В настоящее время я использую:

QDateTime(QLocale("en_US").toDate(QString(__DATE__).simplified(), "MMM d yyyy")).toMSecsSinceEpoch();

Чтобы получить дату и время сборки. Но возможно ли, что в случаях, когда это не сработает, например. возможно ли, что __DATE__ не возвращает Jul 14 2020, а в локальном формате, например. китайский язык? В последнем случае метод todate не будет работать правильно?


person Sven van den Boogaart    schedule 15.07.2020    source источник


Ответы (1)


Из стандарта C++ (черновик):

__DATE__

Дата перевода исходного файла: строковый литерал вида "Mmm dd yyyy", где названия месяцев такие же, как у сгенерированных функцией asctime, а первый символ dd — пробел, если значение меньше чем 10. Если дата перевода недоступна, должна быть указана действительная дата, определяемая реализацией.

http://eel.is/c++draft/cpp#predefined-1.2< /а>

Последнее предложение дает некоторую свободу компилятору, что делать, если дата недоступна. GCC делает это:

Если GCC не может определить текущую дату, он выдаст предупреждающее сообщение (один раз за компиляцию), а __DATE__ расширится до "??? ?? ????".

https://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html

Подводя итог - формат фиксированный и всегда "Mmm dd yyy", с использованием английских имен.

person pklimczu    schedule 15.07.2020
comment
Спасибо, но что, если локаль не английская, Mmm не будет указывать месяц в зависимости от локали. так что вместо Jul 七月, если язык китайский? или он всегда будет даваться на английском языке? - person Sven van den Boogaart; 15.07.2020
comment
en.cppreference.com/w/cpp/chrono/c/asctime asctime возвращает сокращенное название месяца на английском языке из трех букв. Всегда есть шанс, что кто-то создаст свой собственный компилятор, в котором возвращаемое имя будет на другом языке (например, на китайском), но тогда это уже не стандартный C++. - person pklimczu; 15.07.2020