• Как исправить ошибки компиляции Clang под Linux?

    @arteast
    gmtime_s - это изначально была нестандартная функция, придуманная Microsoft (хотя и полезная). Ее и прочие "safe"-функции от MS стандартизировали в C11, но отдельным пакетом - Annex K - и как необязательные к реализации. См. на той странице, что вы указали:
    As with all bounds-checked functions, gmtime_s only guaranteed to be available if __STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1 before including .


    gcc/glibc и clang/libc не определяют __STDC_LIB_EXT1__ и не поддерживают эти функции.

    Также есть функция gmtime_r, которая решает ту же проблему, что и gmtime_s - она гарантированно будет в реализации стандартной библиотеки, но только в C23, т.е. в распоследних версиях компиляторов, которые эту версию поддерживают. Или _может быть_ как расширение - к примеру, на gcc она доступна при наличии макроса __USE_POSIX.

    Отвечая на вопрос - не используйте gmtime_s, если хотите хорошую портабельность кода. Либо
    • использовать свежайшее всё, C23 и gmtime_r,
    • либо прагматичный, но несовсемпортабельный подход - впиливать в cmake и код выбор - на msvc библиотеке использовать gmtime_s, на libc/glibc - __USE_POSIX и gmtime_r
    • либо, раз уж вы используете C++, то еще можно подвинуться на C++20 и C++-ные year_month_day и hh_mm_ss.


    Похожая история с mbstowcs_s - тот же Annex K и нереализованность на других библиотеках. Используйте mbsrtowcs и иже с ним.
    Ответ написан
    Комментировать
  • Как можно починить std::thread?

    @arteast
    На самом деле ругается, судя по логам, не на эту строчку, а чуть ниже на:
    threads.push_back(t);
    Объект std::thread некопируемый, а в этой строчке делается копия. Надо либо делать через move, либо вообще избавиться от t и вставлять анонимный объект, либо вовсе не создавать объект, а использовать emplace_back (чтобы vector сам создал объект).
    Ответ написан
    Комментировать