|
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
|
||||||||||||||||
Получить std::tm из time_point, или как избежать ошибок ODR, связанных с использованием time_t13.12.2020, 19:49. Показов 3949. Ответов 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 из двух связанных таблиц? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|