|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,519
|
||||||||||||||||
Получить std::tm из time_point, или как избежать ошибок ODR, связанных с использованием time_t13.12.2020, 19:49. Показов 4034. Ответов 1
Всем привет!
Есть код:
Он может плавать даже на одном и том же компиляторе, с одними и теми же настройками. Макрос _USE_32BIT_TIME_T, и его аналоги - это мины замедленного действия. Допустим, у вас есть две и более статических библиотек. И эти библиотеки используют сишные функции для работы со временем. Аргументом таких функций выступает time_t. Но одна библиотека собрана в режиме, когда time_t 32х битный, а другая - когда он 64х битный. Главный вопрос темы: что получится в итоге после линковки? 1. Внутри отдельно взятой библиотеки компилятор построит трамплин вида: (фрагмент взят из реализации стандартной библиотеки msvc2019)
2. Однозначно, нельзя передавать значение time_t через границы библиотек. std::time_t взятый из одной библиотеки может оказаться несовместимым с сишными функциями другой библиотеки 3. Вызовы пользовательских функций, таких как getGMT однозначно будут приводить к UB, в связи с нарушением ODR Второй главный вопрос темы: и как в таких условиях конструировать свои пользовательские функции getGMT ???? Первое, что приходит в голову - полный отказ и от time_t, и от всей сишной библиотеки, что с ним работает. Вот так, необдуманные решения руководителей приводят к тому, что инструмент вроде бы есть, но пользоваться им уже нельзя. Вместо сишной библиотеки можно воспользоваться с++ версией - chrono Однако, тут вылазиет другая проблема. Дело в том, что в хронометражке вообще нет функций для работы с календарем. Это - удивительно! Это примерно как "в с++ добавили автомобили, но у них нет ни руля, ни тормозов" В итоге, полноценно пользоваться chrono в отрыве от сишной библиотеки не получится. Потому что единственный способ работать с календарем - получить доступ к std::tm. И вот отсюда третий главный вопрос темы: как из std::chrono::system_clock::time_point получить валидный std::tm не используя std::time_t? Моё решение:
Важно: Я исхожу из предположения, что использование сишных функций безопасно, если это использование носит локальный характер. Ну то есть, переменная time_t - местная, и не пришла откуда то извне. Поэтому её плавающий размер уже никак не сможет навредить. Четвертый и самый главный, заключительный вопрос: корректно ли моё решение?
0
|
||||||||||||||||
| 13.12.2020, 19:49 | |
|
Ответы с готовыми решениями:
1
Как привести тип time_point<std::filesystem::__file_clock, [.]>к типу const time_point<std::chrono::_V2::system_clock Как избежать ошибок линковщика? Реализация простейшего чата: как избежать ошибок? |
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||
| 15.12.2020, 01:14 | |||||||||||||||
Сообщение было отмечено eva2326 как решение
Решениемакрос можно активировать только и только для 32х битных сборок. для 64х битных сборок он запрещен. time_t является 32х-битным если: - у тебя 2005 студия или старше. - у тебя сборка x86 и ты активировала _USE_32BIT_TIME_T (только под виндой для cl/mingw) - у тебя 32х битная ОСЬ во всех остальных случаях time_t будет 64х битным. если две библиотеки линкуются с разными настройками _USE_32BIT_TIME_T, тогда поплывут все структуры, которые используют time_t. например, в библиотеке first.lib создаётся объект структуры:
и ничего с этим сделать нельзя. единственный способ гарантировать корректную работу, это собирать все библиотеки с одинаковым значением _USE_32BIT_TIME_T которую написал тот же самый человек, что и chrono. date полностью совместима с chrono, и является претендентом на влючение в с++20 есть такой
вопреки оффициально документации, метод system_clock::to_time_t, возвращает не оригинальный std::time_t, а неккий __time64_t, который не зависит от значения _USE_32BIT_TIME_T. поэтому, он идеально подходит для передачи между границами библиотек, или модулей.
2
|
|||||||||||||||
| 15.12.2020, 01:14 | |
|
Помогаю со студенческими работами здесь
2
Как избежать ошибок понижения позиций при покупки ссылок? баг msvc, или компиляторы право имеют? (отбрасывание const для возвращаемого типа приводит к ошибке ODR) Аналог типа time_t в Си++ или Borland'е Конветирование строки char в time_t или в struct tm Как получить DataTable из двух связанных таблиц? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию.
2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|