Теперь, когда GCC 11, который поддерживает новые функции календаря и часового пояса выпущен, я пытаюсь использовать их в своем коде.

В следующем минимальном примере:

#include <chrono>
#include <iostream>

int main()
{
    using namespace std;

    cout << chrono::utc_clock::now() << endl;

    return EXIT_SUCCESS;
}

Скомпилирован с использованием следующего:

> /usr/local/gcc-11.1.0/bin/g++-11.1 -std=c++-20 main.cpp

Дает следующую ошибку:

main.cpp: In function ‘int main()’:
main.cpp:8:36: error: incomplete type ‘std::chrono::utc_clock’ used in 
    nested name specifier
    8 |         cout << chrono::utc_clock::now() << endl;
      | 

Я изучил эту ошибку, и, похоже, она обычно возникает из-за предварительных объявлений. Есть ли у кого-нибудь идеи, почему это происходит?

Я также пробовал явно связать с недавно созданной версией libstdc ++ для GCC 11. A:

/usr/local/gcc-11.1.0/bin/g++-11.1 -std=c++20 -L/usr/local/gcc-11.1.0/lib -lstdc++ main.cpp

Но я получаю то же сообщение об ошибке.

Дополнительная информация:

> /usr/local/gcc-11.1.0/bin/g++-11.1 --version

Дает следующий результат:

g++-11.1 (GCC) 12.0.0 20210427 (experimental)
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Что для меня неожиданно, так как я ожидаю увидеть 11.1. Я создал это на MacOS, и моя версия clang++ - 12.0.5. Ожидается ли это и может ли это быть потенциальным источником проблемы?

Кроме того, этот веб-сайт, демонстрирующий поддержку компилятором C Функции стандартной библиотеки ++ 20 показывают, что GCC 11 имеет частичную поддержку обновленного chrono.

Наконец, я создал GCC 11 из исходного кода, используя это видео в качестве справочного материала.

3
Sebastian Wieczorek 3 Май 2021 в 01:14

1 ответ

Лучший ответ

В настоящее время gcc поддерживает только частичную хронографию C ++ 20. Вот текущий состояние исходного кода libstdc ++ по этому вопросу. Здесь показано простое прямое объявление utc_clock без определения, что согласуется с сообщением об ошибке, которое вы видите.

Я вижу дополнительную поддержку для file_clock, включая низкоуровневый API для преобразования между file_clock::time_point и system_clock::time_point. Это существенное дополнение.

Кроме того, я вижу поддержку календарных типов в C ++ 20 (например, year_month_day и т. Д.), О чем говорится в примечаниях к выпуску.

1
Howard Hinnant 2 Май 2021 в 23:54