【问题标题】:Replacing coroutine intrinsics in experimental/resumable在实验/可恢复中替换协程内在函数
【发布时间】:2019-05-17 10:36:45
【问题描述】:

我正在尝试使用 llvm-clang 8.0 编译一个使用 cppwinrt 的类。目前唯一的障碍是clang 找不到experimental/resumable 中定义的协程内在函数的实现。这些是 VC++ 标头 experimental/resumable 中定义的内在函数:

extern "C" size_t _coro_resume(void *);
extern "C" void _coro_destroy(void *);
extern "C" size_t _coro_done(void *);
#pragma intrinsic(_coro_resume)
#pragma intrinsic(_coro_destroy)
#pragma intrinsic(_coro_done)

根据 clang 文档,这些是 clang 中的协程内在函数:

void  __builtin_coro_resume(void *addr);
void  __builtin_coro_destroy(void *addr);
bool  __builtin_coro_done(void *addr);

如果我用它编译的 clang 手动替换标头中的内在函数。然而,这显然不是一个可移植的解决方案。无论如何我可以使用一些 pragma hack 或编译时标头替换来获得相同的结果吗?

【问题讨论】:

    标签: c++ clang c++17 coroutine c++-winrt


    【解决方案1】:

    我想给出一个解决方案,但是由于我的机器上没有clang,所以没有验证。

    #ifdef __clang__
        size_t _coro_resume(void *addr) { __builtin_coro_resume(addr); return 0; }
        void _coro_destroy(void *addr) { __builtin_coro_destroy(addr); }
        size_t _coro_done(void *addr) { return __builtin_coro_done(addr) ? 1 : 0; }
    #else
        extern "C" size_t _coro_resume(void *);
        extern "C" void _coro_destroy(void *);
        extern "C" size_t _coro_done(void *);
        #pragma intrinsic(_coro_resume)
        #pragma intrinsic(_coro_destroy)
        #pragma intrinsic(_coro_done)
    #endif
    

    似乎忽略了函数的返回值。

    【讨论】:

    • 我已经指定我可以通过手动编辑标题来让它工作。我需要的是便携式解决方案。
    猜你喜欢
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2018-09-24
    相关资源
    最近更新 更多