c++20,clang 13.0.0,u8string 支持
c++20, clang 13.0.0, u8string support
我在基于CMAKE的项目中使用clang 13.0.0,CMAKE_CXX_STANDARD定义为20。以下代码导致编译错误(no type named 'u8string' in namespace 'std'):
#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)
我是不是遗漏了什么或者是 clang 错误?我的意思是,如果 std::u8string 还不存在,那么就不应该定义宏,对吧?顺便说一句,如果您知道使用 CMake 以某种方式取消定义它的方法,请分享您的经验。 Here题主也面临同样的问题,我想,但是目前还没有提出解决方案
更新:平台为 RHEL 8.4
更新 2:将 'project' 调用移至 CMakeLists.txt
中的编译器设置下方
Frank's 建议是正确的 - 问题在于 Clang 使用的是旧版本的 libstdc++ 而不是 libc++;
target_compile_options(clang_test PRIVATE -stdlib=libc++)
为我解决了这个问题。虽然我不完全理解为什么它不适用于 libstdc++,但如果您有任何想法,请分享它 here - 我认为这是一个单独的问题。
另外,Tsyvarev's点确实是很重要的一点,编译器应该在工程调用前设置好。我已经更正了问题中的示例。
更新:终于明白失败的原因了:__cpp_char8_t is not sufficient for std::u8string, __cpp_lib_char8_t 应该改用。
感谢大家的帮助!
我在基于CMAKE的项目中使用clang 13.0.0,CMAKE_CXX_STANDARD定义为20。以下代码导致编译错误(no type named 'u8string' in namespace 'std'):
#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)
我是不是遗漏了什么或者是 clang 错误?我的意思是,如果 std::u8string 还不存在,那么就不应该定义宏,对吧?顺便说一句,如果您知道使用 CMake 以某种方式取消定义它的方法,请分享您的经验。 Here题主也面临同样的问题,我想,但是目前还没有提出解决方案
更新:平台为 RHEL 8.4
更新 2:将 'project' 调用移至 CMakeLists.txt
中的编译器设置下方Frank's 建议是正确的 - 问题在于 Clang 使用的是旧版本的 libstdc++ 而不是 libc++;
target_compile_options(clang_test PRIVATE -stdlib=libc++)
为我解决了这个问题。虽然我不完全理解为什么它不适用于 libstdc++,但如果您有任何想法,请分享它 here - 我认为这是一个单独的问题。
另外,Tsyvarev's点确实是很重要的一点,编译器应该在工程调用前设置好。我已经更正了问题中的示例。
更新:终于明白失败的原因了:__cpp_char8_t is not sufficient for std::u8string, __cpp_lib_char8_t 应该改用。
感谢大家的帮助!