使用boost::log::string_literal的示例程序

373 篇文章 ¥29.90 ¥99.00
本文介绍了一个使用Boost.Log库中的boost::log::string_literal的示例程序,展示了如何初始化日志系统,设置控制台和文件日志输出,并使用不同严重性级别输出日志消息。

使用boost::log::string_literal的示例程序

boost::log::string_literal是Boost.Log库中的一个类,它用于表示不可变的字符串文本,并提供了一些方便的方法来处理字符串。下面是一个使用boost::log::string_literal的示例程序:

#include <boost/log/core.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/trivial.hpp>
chen@chen-VirtualBox:~/catkin_ws$ catkin_make 找不到命令 “catkin_make”,但可以通过以下软件包安装它: sudo apt install catkin chen@chen-VirtualBox:~/catkin_ws$ catkin_make Base path: /home/chen/catkin_ws Source space: /home/chen/catkin_ws/src Build space: /home/chen/catkin_ws/build Devel space: /home/chen/catkin_ws/devel Install space: /home/chen/catkin_ws/install Creating symlink "/home/chen/catkin_ws/src/CMakeLists.txt" pointing to "/usr/share/catkin/cmake/toplevel.cmake" #### #### Running command: "cmake /home/chen/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/chen/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/chen/catkin_ws/install -G Unix Makefiles" in "/home/chen/catkin_ws/build" #### -- The C compiler identification is GNU 11.4.0 -- The CXX compiler identification is GNU 11.4.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Using CATKIN_DEVEL_PREFIX: /home/chen/catkin_ws/devel -- Using CMAKE_PREFIX_PATH: -- Found PythonInterp: /usr/bin/python3 (found suitable version "3.10.12", minimum required is "3") -- Using PYTHON_EXECUTABLE: /usr/bin/python3 -- Using Debian Python package layout -- Using empy: /usr/bin/empy -- Using CATKIN_ENABLE_TESTING: ON -- Call enable_testing() -- Using CATKIN_TEST_RESULTS_DIR: /home/chen/catkin_ws/build/test_results -- GTest is available -- GMock is not available. Please install libgmock-dev to enable tests involving GMock. -- nosetests not found, Python tests can not be run (try installing package 'python3-nose') -- Found Threads: TRUE -- catkin 0.8.10 -- BUILD_SHARED_LIBS is on Traceback (most recent call last): File "/home/chen/catkin_ws/build/catkin_generated/generate_cached_setup.py", line 22, in <module> code = generate_environment_script('/home/chen/catkin_ws/devel/env.sh') File "/usr/lib/python3/dist-packages/catkin/environment_cache.py", line 63, in generate_environment_script env_after = ast.literal_eval(output.decode('utf8')) File "/usr/lib/python3.10/ast.py", line 64, in literal_eval node_or_string = parse(node_or_string.lstrip(" \t"), mode='eval') File "/usr/lib/python3.10/ast.py", line 50, in parse return compile(source, filename, mode, flags, File "<unknown>", line 1 ROS_DISTRO was set to 'humble' before. Please make sure that the environment does not mix paths from different distributions. ^^^ SyntaxError: invalid syntax CMake Error at /usr/share/catkin/cmake/safe_execute_process.cmake:11 (message): execute_process(/usr/bin/python3 "/home/chen/catkin_ws/build/catkin_generated/generate_cached_setup.py") returned error code 1 Call Stack (most recent call first): /usr/share/catkin/cmake/all.cmake:221 (safe_execute_process) /usr/share/catkin/cmake/catkinConfig.cmake:20 (include) CMakeLists.txt:58 (find_package) -- Configuring incomplete, errors occurred! See also "/home/chen/catkin_ws/build/CMakeFiles/CMakeOutput.log". Invoking "cmake" failed
09-06
<think>首先,用户要求学习C++中std::string_view的使用,所以我需要提供一个使用指南。系统指令要求使用中文回答,所以我必须用中文写。 关键点来自系统指令: - 行内数学表达式用$...$,但用户的问题是关于C++编程,没有数学表达式,所以可能不需要。 - 独立公式用$$...$$,但同样,这里没有数学公式。 - LaTeX语法正确:确保任何代码或格式正确。 - 使用中文回答。 - 生成相关问题:在回答结束时,添加相关问题。 - 引用的段落末尾添加引用标识:在回答中引用时,用[^数字]格式。 - 回答结构清晰,帮助用户逐步解决问题。 参考站内引用提供了关于std::string_view的信息: - [^1]: 概述,轻量级、非拥有的字符串视图。 - [^2]: 性能高,不拷贝字符串,只记录指针和偏移。 - [^3]: 轻量级字符串视图类,如何初始化。 - [^4]: 设计特点:非拥有、只读、轻量级、不变性;生命周期管理重要。 - [^5]: 不需要空终止符;初始化方式;不能隐式转换为std::string。 我需要基于这些构建一个清晰的指南。结构应该: 1. 介绍std::string_view是什么。 2. 为什么使用它(优点)。 3. 如何使用它(语法、示例)。 4. 注意事项(如生命周期管理)。 5. 与std::string的比较。 6. 示例代码。 最后,生成相关问题。 确保回答真实可靠,基于提供的引用。 大纲: - **引言**:介绍std::string_view。 - **为什么使用std::string_view**:性能优势等。 - **基本用法**:如何声明、初始化、使用。 - **常见操作**:访问字符、子字符串等。 - **注意事项**:生命周期问题、只读性。 - **与std::string的区别**:比较两者的优缺点。 - **示例代码**:展示简单例子。 - **总结**。 - **相关问题**。 在回答中,引用信息时添加引用标识,例如:[^1]。 使用中文:整个回答用中文写。 代码部分:使用代码块,如示例中的Python代码,但这里是C++,所以用C++代码块。</think>### C++ std::string_view 使用指南 std::string_view 是 C++17 引入的一个轻量级、非拥有的字符串视图类型。它提供了一种高效的方式来查看字符串数据,而无需拷贝原始字符串,从而提升性能。本指南将逐步介绍其核心概念、使用方法和注意事项,帮助您快速掌握。 #### 1. **什么是 std::string_view?** std::string_view 是一个只读的字符串视图类,它不拥有字符串数据,而是存储一个指向原始字符串的指针和长度信息。这意味着它避免了不必要的内存分配和拷贝,特别适合在只读场景中优化性能[^1][^4]。例如: - **轻量级**:占用内存小(通常为一个指针加一个长度值)。 - **非拥有**:它不管理字符串的生命周期,原始字符串必须由开发者确保有效。 - **只读**:不能修改字符串内容,只能用于读取操作[^2][^4]。 #### 2. **为什么使用 std::string_view?** - **性能优势**:相比 std::string,它避免了拷贝开销。例如,当传递字符串参数时,std::string 会创建临时副本,而 std::string_view 直接引用原始数据,减少内存分配和延迟[^2][^4]。 - **灵活性**:支持多种字符串源初始化,包括 C 风格字符串、std::string 和另一个 std::string_view。 - **高效长度处理**:记录字符串长度,无需依赖空终止符('\0'),避免频繁调用 strlen 等函数[^5][^4]。 #### 3. **基本用法** 以下是 std::string_view 的核心操作: - **声明和初始化**: ```cpp #include <string_view> #include <iostream> #include <string> int main() { // 从 C 风格字符串初始化 const char* cstr = "Hello, C++"; std::string_view sv1(cstr); // 视图指向 cstr // 从 std::string 初始化 std::string str = "Hello, World"; std::string_view sv2(str); // 视图指向 str // 从另一个 std::string_view 初始化 std::string_view sv3 = sv2; // 输出视图内容 std::cout << sv1 << std::endl; // 输出: Hello, C++ std::cout << sv2 << std::endl; // 输出: Hello, World return 0; } ``` - **常见操作**: - **访问元素**:使用 `operator[]` 或 `at()`。 ```cpp std::string_view sv = "Test"; char first_char = sv[0]; // 'T' ``` - **获取子字符串**:使用 `substr()`。 ```cpp std::string_view sub = sv.substr(1, 2); // 从索引 1 开始,长度 2: "es" ``` - **获取长度**:使用 `size()` 或 `length()`。 ```cpp size_t len = sv.size(); // 4 ``` - **比较字符串**:支持 `==`, `!=`, `<` 等操作符。 ```cpp if (sv == "Test") { /* 相等 */ } ``` #### 4. **注意事项** - **生命周期管理**:std::string_view 不拥有数据,原始字符串被销毁后继续使用会导致未定义行为(UB)。例如: ```cpp std::string_view create_view() { std::string temp = "Temporary"; return std::string_view(temp); // 危险!temp 销毁后视图无效 } // 调用时视图可能指向无效内存 ``` 解决方案:确保原始字符串的生存期长于视图[^4][^5]。 - **只读性**:不能修改内容。如果需要修改,应转换为 std::string: ```cpp std::string_view sv = "View"; std::string str(sv); // 显式转换,创建副本 str[0] = 'v'; // 可修改 ``` - **隐式转换限制**:std::string_view 不会隐式转换为 std::string,因为转换会触发拷贝。必须显式处理: ```cpp void process_string(std::string s); // 函数接受 std::string std::string_view sv = "Data"; // process_string(sv); // 错误!不能隐式转换 process_string(std::string(sv)); // 正确:显式转换 ``` - **不支持空终止符**:std::string_view 不依赖 '\0',而是用长度标记结尾。这在处理二进制数据时更安全[^5]。 #### 5. **与 std::string 的比较** | 特性 | std::string_view | std::string | |---------------------|-----------------------------------|----------------------------------| | **所有权** | 非拥有(视图) | 拥有(管理内存) | | **性能** | 高(无拷贝开销) | 低(可能涉及内存分配) | | **可修改性** | 只读 | 可修改 | | **生命周期管理** | 依赖原始字符串 | 独立管理 | | **隐式转换** | 可从 C 字符串或 std::string 初始化 | 可从 std::string_view 显式转换 | - **使用场景**: - 用 std::string_view:只读函数参数、解析字符串、性能敏感代码[^2][^4]。 - 用 std::string:需要修改字符串或确保独立所有权的场景。 #### 6. **示例:优化函数参数** 以下示例展示如何用 std::string_view 避免拷贝: ```cpp #include <string_view> #include <iostream> // 函数接受 std::string_view,避免拷贝 void print_length(std::string_view sv) { std::cout << "Length: " << sv.size() << ", Content: " << sv << std::endl; } int main() { const char* cstr = "C-style string"; std::string str = "std::string"; print_length(cstr); // 直接传递 C 字符串 print_length(str); // 传递 std::string print_length("Literal"); // 传递字符串字面量 return 0; } ``` 输出: ``` Length: 14, Content: C-style string Length: 11, Content: std::string Length: 7, Content: Literal ``` #### 总结 std::string_view 是 C++17 的重要特性,用于高效处理只读字符串。通过避免不必要的拷贝,它能显著提升性能,但需谨慎管理原始字符串的生命周期。在只读场景中,优先使用它替代 const std::string& 或 const char*,以减少开销[^1][^4][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值