#include <iostream>
int main() {
#if __has_include(<coroutine>)
std::cout << "__has_include(<coroutine>)" << std::endl;
#endif
#if defined(__cpp_impl_coroutine)
std::cout << "__cpp_impl_coroutine is defined." << std::endl;
#endif
#if defined(__cpp_coroutines)
std::cout << "__cpp_coroutines is defined." << std::endl;
#else
std::cout << "__cpp_coroutines IS NOT defined!" << std::endl;
#endif
}
Мой компилятор clang-18.1.0.
Создайте код с помощью clang++ -std=c++20 -stdlib=libc++ ./main.cpp, и результат будет следующим:
__has_include(<coroutine>)
__cpp_impl_coroutine is defined.
__cpp_coroutines IS NOT defined!
Почему последний clang не определяет макрос проверки функций __cpp_coroutines?
возможно, сообщить об ошибке?
@Someprogrammerdude, никакого эффекта, даже если #include <coroutine>.
@StoryTeller-UnslanderMonica, никакого эффекта, даже если clang++ -std=c++20 -fcoroutines -stdlib=libc++ ./main.cpp, а также, если задан -std=c++20, -fcoroutines будет игнорироваться.
__cpp_coroutines похоже, не является макросом проверки функций . Вы имели в виду __cpp_lib_coroutine? godbolt.org/z/n666xfhWf
@AlanBirtles, посмотрите эту ссылку: omegaup.com/docs/cpp/en/cpp/feature_test.html
Кажется, это архив cppreference за 2018 год omegaup.com/docs/cpp/en , то есть до завершения разработки c++20.
Я не вижу __cpp_coroutines в документации.
Примечание: ничто в этом коде не требует дополнительных вещей, которые делает std::endl. Используйте '\n', чтобы завершить строку, если нет веской причины не делать этого.





__cpp_coroutines — это устаревший макрос проверки функций , он был разделен на __cpp_lib_coroutine и __cpp_impl_coroutine до того, как C++20 был стандартизирован . Для получения последней информации вам следует использовать обновленные справочные страницы cpp https://en.cppreference.com/w/cpp/feature_test
Clang похоже перестал определять __cpp_coroutines начиная с 17 версии https://godbolt.org/z/nc1GhGGTo
Кроме того, чтобы убедиться в наличии поддерживаемых макросов проверки функций, добавьте #include <version>.
Я столкнулся с аналогичной проблемой, когда мне нужен был код для компиляции:
Я использовал следующее
#include <version> // Needed to pull in __cpp_lib_coroutine (can gate on compiler version if needed)
// This is just to demonstrate whether these feature tests are present at all
#if defined(__cpp_coroutines)
# pragma message("__cpp_coroutines defined")
#endif
#if defined(__cpp_lib_coroutine)
# pragma message("__cpp_lib_coroutine defined")
#endif
// This determines whether coroutines are present and makes a handy cross-compatible compiler flag for it
#if !defined(__clang__)
# error This file should only be used to compile with clang
#else
#if __clang_major__ < 17
#if defined(__cpp_coroutines)
#define COROUTINES_PRESENT 1
#pragma message("Coroutines present clang < 17!") // Just FYI
#else
#define COROUTINES_PRESENT 0
#pragma message("Coroutines absent clang < 17!") // Just FYI
#endif
#else
#if defined(__cpp_lib_coroutine)
#define COROUTINES_PRESENT 1
#pragma message("Coroutines present clang >= 17!") // Just FYI
#else
#define COROUTINES_PRESENT 0
#pragma message("Coroutines absent clang >= 17!") // Just FYI
#endif
#endif
#endif
// This is where your code goes
#if COROUTINES_PRESENT
#pragma message("Coroutines present!")
#else
#pragma message("Coroutines absent!")
#endif
int main(){
}
Для компиляции используйте:
clang++15 main.cpp --std=c++17 -fcoroutines-ts
clang++15 main.cpp --std=c++20
clang++17 main.cpp --std=c++20
Из этого обсуждения похоже, что -fcoroutines-ts устарел в LLVM 16, поэтому для использования сопрограмм в LLVM 17 вам нужен c++20.
Возможно, вам нужно включить заголовок
<coroutine>?