gpt4 book ai didi

c++ - 使用 clang 的功能检查宏来检测 std::launder 的存在

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:35 28 4
gpt4 key购买 nike

我必须使用不同版本的 clang 编译相同的代码。由于代码包含一些 c++17 功能,并非每个版本的 clang 都支持这些功能,因此我想在编译时检查它们是否受支持。据我所知,clang 的 feature checking macros是正确的方法。

我的问题特别出现在 std::launder 上。

我创建了这个最小的例子:

#include "iostream"

#if __has_builtin(__builtin_launder)
void test() {
int i = 42;
std::cout << "Should compile: " << std::launder(&i) << std::endl;
}
#else
void test() {
int i = 42;
std::cout << "Should not even compile: " << std::launder(&i) << std::endl;
}
#endif

int main(){
test();
}

如果我使用 clang++ -std=c++1z -stdlib=libc++ -Wall -pedantic test3.cpp && ./a.out 编译它(clang 版本 6.0.0,libc++) >
输出是:甚至不应该编译:0x7fff75116f64

虽然显然支持 std::launder,但内置检查不起作用。因为它与 reviews llvm: Implement std::launder 中的检查相同,我假设支票是正确的。

我错过了什么?我觉得它非常简单,但我没有看到。

最坏的情况是我会为此目的使用 cmake 的 try-compile 机制,但这似乎有点矫枉过正,我仍然有兴趣找出实际问题所在。

最佳答案

从链接到您给出的评论,在(库函数)std::launder 的实现中:

#ifdef _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER 
return __builtin_launder(__p);
#else
return __p;
#endif
}
如果没有内置函数,

std::launder 也在那里。因此,内置函数的存在或不存在不会告诉您 std::launder 是否存在。


要测试您是否有 std::launder(这似乎是您想要的),您可以使用您的配置系统(cmake、autoconf、...)或试试您的运气使用新的 (C++17) 功能测试:

#include <new> // important!
#if __cpp_lib_launder >= 201606
// have std::launder for sure
#else
// not sure, could've std::launder either way
#endif

关于c++ - 使用 clang 的功能检查宏来检测 std::launder 的存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49705749/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com