c++20, clang 13.0.0, u8string support(C++20、clang 13.0.0、u8字符串支持)
问题描述
我在一个基于CMAKE的项目中使用clang 13.0.0,CMAKE_CXX_STANDARD被定义为20。以下代码导致编译错误(命名空间‘std’中没有名为‘u8string’的类型):
#include <iostream>
#include <string>
int main() {
#ifdef __cpp_char8_t
std::u8string sss = u8"a"; // <---- this branch is picked up
#else
std::string sss = "b"
#endif
return 0;
}
下面是CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang++)
project(clang_test)
add_executable(clang_test main.cpp)
我是漏掉了什么,还是它是叮当作响的错误?我的意思是,如果std::u8string还不在那里,宏就不应该被定义,对吗?顺便说一句,如果你知道用CMake取消定义它的方法,请分享你的经验。Here我认为开场白面临着同样的问题,但还没有提出解决方案。
更新:平台为RHEL 8.4
更新2:将‘project’调用移至CMakeLists.txt中的编译器设置下方
clang
Frank's建议是正确的-问题在于推荐答案使用的是旧版本的libstdc++,而不是libc++;
target_compile_options(clang_test PRIVATE -stdlib=libc++)
为我解决了这个问题。虽然我不完全理解为什么它不能与libstdc++一起工作,但如果您有任何想法,请与我分享here-我假设这是一个单独的问题。
另外,Tsyvarev'spoint确实是一个非常重要的点,编译器应该在项目调用之前设置。我已更正问题中的示例。
更新:终于明白失败的原因:__cpp_char8_t对std::u8string不够用,应该使用_cpp_lib_char8_t。
感谢大家的帮助!
这篇关于C++20、clang 13.0.0、u8字符串支持的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:C++20、clang 13.0.0、u8字符串支持


基础教程推荐
- C++,'if' 表达式中的变量声明 2021-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 设计字符串本地化的最佳方法 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31