替换实验/可恢复程序中的协程内在函数

时间:2018-12-17 04:05:46

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

我正在尝试使用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);

如果我手动将标头中的内部函数替换为它所编译的叮当声。但是,这显然不是便携式解决方案。无论如何,我可以通过使用一些编译指示或编译时标头替换来达到相同的结果吗?

1 个答案:

答案 0 :(得分:0)

我想提供一个解决方案,但是由于我的计算机上没有叮当声,因此未得到验证。

#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

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